Find and fix issue filenames with missing or duplicate IDs across types (e.g., BUG-007 and FEAT-007)
Scanned 10/6/2026
npx -y skills add BrennonTWilliams/little-loops --skill ll-normalize-issues --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Ll Normalize Issues?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/brennontwilliams-ll-normalize-issues)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: ll-normalize-issues
description: Find and fix issue filenames with missing or duplicate IDs across types (e.g., BUG-007 and FEAT-007)
allowed-tools:
- Read
- Glob
- Edit
- Bash(git:*, ll-issues:*)
arguments:
- name: issue_id
description: "Optional issue ID to scope reported/applied findings (duplicate detection stays corpus-wide)"
required: false
- name: flags
description: "Optional flags: --auto (non-interactive), --check (check-only for FSM evaluators), --strict"
required: false
---
# Normalize Issues
Filename/ID mechanics (missing IDs, cross-type duplicate IDs, legacy status
directories) are handled deterministically by `ll-issues normalize`. This
command wraps that CLI and keeps only the two judgment calls it deliberately
leaves to an LLM: type-misclassification review, and matching issues to
relevant project documents.
## Process
### 1. Run the Deterministic Scan
```bash
ll-issues normalize {{issue_id}} {{flags}}
```
This detects and reports (and, with `--auto`, fixes) five finding kinds:
| Kind | Auto-fixed by `--auto`? | Gates `--check` (non-strict)? |
|------|--------------------------|--------------------------------|
| `missing_id` | yes | yes |
| `malformed_filename` | yes | yes |
| `duplicate_id` | yes | yes |
| `legacy_dir` | no — run `ll-migrate` | only under `--strict` |
| `type_mismatch` | never — semantic judgment (Step 2 below) | only under `--strict` |
`--check` is the deterministic FSM exit-code gate (0 clean / 1 violations,
covering the three auto-fixable classes only unless `--strict` is passed).
`--auto` applies `git mv` renames, syncs frontmatter `id:`, and repoints any
inbound `blocked_by`/`depends_on`/`parent`/`epic`/`relates_to`/`supersedes`
edge that named a reassigned ID. In `--auto` mode, apply reclassifications
without further prompting; otherwise present the CLI's report and confirm
before re-running with `--auto`.
### 2. Review Type Misclassifications (LLM Judgment)
`ll-issues normalize` reports `type_mismatch` findings but never applies
them — this is the one class of finding that needs judgment, not just a
keyword count. For each `type_mismatch` in the report:
**Heuristics** — the CLI counts these signal keywords in Summary,
Motivation/Current Behavior, and Root Cause sections for each candidate type.
`type_mismatch` findings are only reported for `open`/`in_progress`/`blocked`
issues — `done`/`cancelled`/`deferred` issues are excluded since reclassifying
closed work has no actionable follow-up (ENH-3053):
| Signal keywords | Suggests type |
|-----------------|---------------|
| "broken", "regression", "error", "crash", "fails", "wrong behavior", "should not", "defect", "incorrect", "unexpected" | BUG |
| "new capability", "users can't currently", "add support for", "implement", "missing feature", "not yet possible" | FEAT |
| "improve", "optimize", "enhance", "refactor", "better UX", "reduce", "increase performance", "simplify" | ENH |
| "decompose into", "umbrella", "rollup of", "multi-issue initiative", "coordination container", "should be an epic", "milestone" | EPIC |
1. Read the flagged issue file to confirm (or override) the CLI's inferred type
2. If confirmed, reclassify manually: `git mv` the file into the target
category directory (`bugs/` → BUG, `features/` → FEAT, `enhancements/` →
ENH, `epics/` → EPIC) with the new type prefix, then re-run
`ll-issues normalize --auto` so `id:`/inbound edges stay in sync
3. If the CLI's signal count is a false positive (ambiguous or ENH-vs-BUG
phrasing), leave the file as-is
### 3. Add Missing Document References (if `documents.enabled`)
**Skip this step if** `documents.enabled` is not `true` in `.ll/ll-config.json`,
or no documents are configured.
For each issue file missing a `## Related Key Documentation` section, or
carrying only placeholder text (`_No documents linked`, `_No relevant
documents identified`):
1. Load documents from `{{config.documents.categories}}`
2. Read each document and extract key concepts
3. Match against the issue's content; select the top 3 matches
4. Add or update the `## Related Key Documentation` section (insert before
`## Labels` or the final `---` footer if the section is missing; replace
the placeholder line if it exists)
5. Note additions in your summary:
```markdown
## Document References Added
| Issue | Documents Linked |
|-------|------------------|
| BUG-071 | docs/ARCHITECTURE.md, docs/API.md |
```
## Arguments
$ARGUMENTS
- **issue_id** (optional): Scope reported/applied findings to this issue;
duplicate-ID detection and next-ID allocation always run corpus-wide
- **flags** (optional):
- `--auto` — apply all auto-fixable findings without prompting
- `--check` — FSM-gate mode: exit 0 clean / 1 violations, no fixes applied
- `--strict` — widen `--check` to also gate on `legacy_dir`/`type_mismatch`
## Examples
```bash
/ll:normalize-issues # report all findings
/ll:normalize-issues --check # FSM check-only gate
/ll:normalize-issues --auto # apply all auto-fixable findings
/ll:normalize-issues ENH-2944 --auto # scope to one issue
```
Pairs with `/ll:scan-codebase` (fix non-standard filenames after scanning),
`/ll:verify-issues` (validate content post-normalize), and
`/ll:prioritize-issues` (normalizes IDs before priorities are assigned).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!