Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,8 @@
"tags": ["guard", "security", "secrets", "hardcoded-paths", "git", "cli-flags", "hook"]
},
{
"name": "bug-report",
"source": "./plugins/bug-report",
"name": "bugs",
"source": "./plugins/bugs",
"category": "maintenance",
"tags": ["bug", "bug-report", "defect", "triage", "issue", "skill"]
},
Expand Down
2 changes: 1 addition & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"autonomy@melodic-software": true,
"bash-format@melodic-software": true,
"biome-format@melodic-software": true,
"bug-report@melodic-software": true,
"bugs@melodic-software": true,
"claude-config@melodic-software": true,
"claude-memory@melodic-software": true,
"claude-ops@melodic-software": true,
Expand Down
2 changes: 1 addition & 1 deletion docs/CATALOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ plugin manifests and kept in sync by CI — never hand-edit it; the category voc

## Maintenance

- [`bug-report`](../plugins/bug-report) — Produces a structured five-field bug report — title, steps to reproduce, expected vs actual, severity with justification, and suggested fix location — from an informal defect description. Read-only by default: it emits the report and never edits code, opens a PR, or files an issue on its own.
- [`bugs`](../plugins/bugs) — Produces a structured five-field bug report — title, steps to reproduce, expected vs actual, severity with justification, and suggested fix location — from an informal defect description. Read-only by default: it emits the report and never edits code, opens a PR, or files an issue on its own.
- [`debugging`](../plugins/debugging) — Debug observed failures via a disciplined six-phase loop: build a fast deterministic reproduction signal, reproduce, rank falsifiable hypotheses, instrument, fix with a regression test, then clean up and post-mortem.
- [`docs-hygiene`](../plugins/docs-hygiene) — Documentation-hygiene toolkit: compress (flavor-trim markdown with a semantic-diff safety net), audit-noise (classify markdown noise), extract-ssot (deduplicate repeated content into a single source of truth), audit-encapsulation (detect citations into skill-private surfaces), rename-references (sweep stale references after renames), audit-derivability (classify whether a whole document earns its existence — could a fresh agent re-derive it from the code?), audit-progressive-disclosure (grade instruction files against a load-tier model for split opportunities and hub/spoke disclosure defects), write-for-agents (authoring-time doctrine that fires while agent-consumed markdown is being written), and write-for-humans (the same moment for the other reader — end-user READMEs, RFCs, release notes and guides — resolving the consuming project's own style guide first).
- [`code-tidying`](../plugins/code-tidying) — Code tidying and comment hygiene: /code-tidying:tidy proactively hunts a rotated, glob-scoped lane for Beck-style tidyings under a research-backed scope budget and ships one tight PR; /code-tidying:batch-simplify sweeps a time window, a branch, or an entire repository through grouped, dependency-ordered simplification waves with a never-drop deferred-items contract; /code-tidying:dissolve-comments enforces self-describing expressive code over a diff or target, widening to the branch diff and then the whole repository when the tree is clean — deletes zero-information comments, dissolves code-expressible ones into names and structure behind a tests gate (safe mode restricts applied edits to removals), and keeps only terse load-bearing comments code cannot express; /code-tidying:audit-comment-residue is a read-only classifier that flags history, plan, conversational, and ticket/PR residue in code comments for author-applied deletion. Project-specific tidy lanes are scaffolded into a tracked .claude/tidy-lanes/ config folder by a re-runnable setup skill.
Expand Down
4 changes: 2 additions & 2 deletions docs/SKILL-CHEAT-SHEET.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ owned by [docs/CATALOG-TAXONOMY.md](CATALOG-TAXONOMY.md).

| Skill | Plugin | What it does |
| --- | --- | --- |
| [`/bug-report:write`](../plugins/bug-report/skills/write/SKILL.md) | `bug-report` | Turn an informal bug description into a structured 5-field report, read-only |
| [`/bugs:write`](../plugins/bugs/skills/write/SKILL.md) | `bugs` | Turn an informal bug description into a structured 5-field report, read-only |
| [`/planning:audit-answers`](../plugins/planning/skills/audit-answers/SKILL.md) | `planning` | Adversarially validate interview answers with fresh-context agents |
| [`/planning:brainstorm`](../plugins/planning/skills/brainstorm/SKILL.md) | `planning` | Diverge into codebase-grounded candidate approaches before scoping |
| [`/planning:interview`](../plugins/planning/skills/interview/SKILL.md) | `planning` | Interview in frontier rounds until the task contract is locked |
Expand Down Expand Up @@ -228,7 +228,7 @@ owned by [docs/CATALOG-TAXONOMY.md](CATALOG-TAXONOMY.md).

| Skill | Plugin | Cadence | What it does |
| --- | --- | --- | --- |
| [`/bug-report:scan`](../plugins/bug-report/skills/scan/SKILL.md) | `bug-report` | daily | Proactively hunt resting code for unobserved bugs, verify adversarially, report read-only |
| [`/bugs:scan`](../plugins/bugs/skills/scan/SKILL.md) | `bugs` | daily | Proactively hunt resting code for unobserved bugs, verify adversarially, report read-only |
| [`/claude-ops:audit-install-state`](../plugins/claude-ops/skills/audit-install-state/SKILL.md) | `claude-ops` | weekly | Audit a Claude Code install directory — what is there, what the product manages, what is stale |
| [`/claude-ops:audit-native-overlap`](../plugins/claude-ops/skills/audit-native-overlap/SKILL.md) | `claude-ops` | weekly | Map native Claude Code surfaces against this repo's components and record human-gated verdicts |
| [`/claude-ops:audit-performance`](../plugins/claude-ops/skills/audit-performance/SKILL.md) | `claude-ops` | continuous | Capture slowness evidence while slow — version, sweep health, tree walk, sessions, fleet |
Expand Down
2 changes: 1 addition & 1 deletion docs/conventions/config-cascade/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ open.
| `source-control` | `.claude/source-control.md` | all three | conforms (per-key override, #660); enforcement reads team-tracked only per [`commit-convention`](../commit-convention/README.md); loop-lane keys (`babysit_loop_*`, read by the source-control babysit lane; the work-items lanes tie in via the loop-lane convention only) ride the same surface, with the merge-rung key in the policy-floor class — standing raises bind from the team-tracked layer only, and the one named single-invocation exception is an explicitly typed argument rather than a config value in any layer, per [`loop-lane`](../loop-lane/README.md) |
| `toolchain` / `ecosystem-commands` | `.claude/ecosystems/<ecosystem>.yaml` | all three | conforms |
| `codebase-health` | `.claude/codebase-health.md` | all three | conforms (concatenating, with a declared empty-list opt-out) |
| `bug-report` | `.claude/bug-report.md` | all three | conforms; `lanes` concatenate and deduplicate by lane `name`, with a declared empty-list opt-out that also drops the bundled defaults, and `filing_posture` is a nearest-wins scalar. Keys owned by the plugin's `reference/config.md`, which also partitions them from the plugin's `output_dir` `userConfig` option — that option is never a key in this surface, and a layer declaring it is reported as an inert unknown key. Written (team layer only) by `/bug-report:setup apply`, read by `/bug-report:scan` |
| `bugs` | `.claude/bugs.md` | all three | conforms; `lanes` concatenate and deduplicate by lane `name`, with a declared empty-list opt-out that also drops the bundled defaults, and `filing_posture` is a nearest-wins scalar. Keys owned by the plugin's `reference/config.md`, which also partitions them from the plugin's `output_dir` `userConfig` option — that option is never a key in this surface, and a layer declaring it is reported as an inert unknown key. Written (team layer only) by `/bugs:setup apply`, read by `/bugs:scan` |
| `github` | `.claude/github/` (`routing.yaml` per-key override, `conventions.md` concatenating) | all three | conforms; policy-floor inversion on write-posture routing keys, declared in the plugin's `change-routing.md` |
| `autonomy` | `.claude/autonomy/binding.json` | all three, plus an org rung | declared deviation |
| `standards` (`planning`, `review`) | `<standards_dir>/`, rooted by `.claude/standards.yaml` | all three | precedence inversion ratified via policy-floor class (#649); layer location outside `.claude/` still observed, not ratified |
Expand Down
8 changes: 4 additions & 4 deletions docs/conventions/plugin-data-report-keying/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ skill's namespace during review.

### 1c — the "looks scoped but isn't" case, named so it is not repeated

`plugins/bug-report/skills/write/SKILL.md:97` keys on the **kebab-cased basename of the project
`plugins/bugs/skills/write/SKILL.md:97` keys on the **kebab-cased basename of the project
root**:

> `${CLAUDE_PLUGIN_DATA}/bug-reports/<project-slug>/` … The plugin data directory is per-plugin, not
Expand All @@ -108,7 +108,7 @@ duplicate scan cross-matches between them. It escapes *overwrite* only because i
timestamped. `plugins/claude-config/skills/unhobble/SKILL.md:53-62` names the same insufficiency in
prose: "`${CLAUDE_PLUGIN_DATA}` is machine-global, so two checkouts sharing a basename…".

**This is recorded here as the worked example, not filed as a `bug-report` defect.** A basename is
**This is recorded here as the worked example, not filed as a `bugs` defect.** A basename is
not project identity. Nothing here obliges an immediate migration of an existing keyed-by-basename
writer; it obliges the next one not to repeat it.

Expand Down Expand Up @@ -165,8 +165,8 @@ holds every project's artifact under the same deletable root.
| `claude-config:audit-prompting-postures` | Keyed (#2250) |
| `claude-config:audit-instructions` | Keyed, plus rule 3 on the delta computation |
| `claude-memory:audit` | Keyed on write **and** on both read paths (`report`, `fix`), plus rule 3 |
| `bug-report:write` / `bug-report:setup` | Keyed by project-root **basename** — rule 1c's worked example; not migrated |
| `bug-report:scan` | Same key, same tree, one timestamped file per run — it reuses `write`'s Step 4 path precedence rather than resolving its own, so it inherits rule 1c's basename collision unmigrated instead of introducing a second scheme (and, like `write`, lands outside this tree entirely when the operator configures `output_dir`). Its reports carry a cursor metadata block the next bare run reads back to pick a lane: a read-back artifact under rule 2, and a rule 3 surface, since the newest report at the derived key is the cursor's only authority and a colliding key would rotate lanes off another checkout's history. Absent at the key is the documented zero state — rotation falls through to the date-derived lane floor, never to an unkeyed path |
| `bugs:write` / `bugs:setup` | Keyed by project-root **basename** — rule 1c's worked example; not migrated |
| `bugs:scan` | Same key, same tree, one timestamped file per run — it reuses `write`'s Step 4 path precedence rather than resolving its own, so it inherits rule 1c's basename collision unmigrated instead of introducing a second scheme (and, like `write`, lands outside this tree entirely when the operator configures `output_dir`). Its reports carry a cursor metadata block the next bare run reads back to pick a lane: a read-back artifact under rule 2, and a rule 3 surface, since the newest report at the derived key is the cursor's only authority and a colliding key would rotate lanes off another checkout's history. Absent at the key is the documented zero state — rotation falls through to the date-derived lane floor, never to an unkeyed path |
| `claude-config:unhobble` | Different solution, same problem: keys by `<experiment-id>` whose basename is *a label*, and records the canonical checkout identity (absolute worktree path, and the origin URL when one exists) **in the manifest**, verifying it before every later phase. Verification instead of a keyed path; acceptable because the artifact is never *served* — a mismatch aborts and names the conflicting path |
| `docs/conventions/topic-docs/` non-repo fallback | Keyed by **topic slug**, not project (`${CLAUDE_PLUGIN_DATA}/topic-docs/<slug>/`, the non-interactive branch when no project root resolves) — an instance of the gap, recorded here rather than silently declared conformant |
| `machine-health:audit` | Not keyed — roots are passed in by the caller, deliberately, per that skill's own inherited-variable hazard. Cited above for retention shape only |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "bug-report",
"version": "0.8.0",
"name": "bugs",
"version": "0.9.0",
"description": "Produces a structured five-field bug report — title, steps to reproduce, expected vs actual, severity with justification, and suggested fix location — from an informal defect description. Read-only by default: it emits the report and never edits code, opens a PR, or files an issue on its own.",
"author": {
"name": "Melodic Software",
Expand All @@ -10,7 +10,7 @@
"license": "MIT",
"keywords": [
"bug",
"bug-report",
"bugs",
"defect",
"scan",
"bug-hunting",
Expand Down
21 changes: 20 additions & 1 deletion plugins/bug-report/CHANGELOG.md → plugins/bugs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,27 @@
# Changelog

All notable changes to the `bug-report` plugin are documented here. Format follows
All notable changes to the `bugs` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.9.0]

### Changed

- **BREAKING: the plugin is renamed `bug-report` → `bugs`.** With `scan` beside `write`, the plugin's
identity is the full front half of the bug lifecycle — find them, report them — and the old name
described only the second half. Skills are now `/bugs:scan`, `/bugs:write`, `/bugs:setup`; the
tracked team config surface renames with it (`.claude/bug-report.md` → `.claude/bugs.md`, same keys,
same cascade, per `reference/config.md`); the plugin-data root moves with the plugin name, so
previously persisted reports and cursor metadata are not read by the renamed plugin (re-created on
the next run). No aliasing or migration shim is shipped. Migration: the two names are distinct
plugin installations, so install `bugs@<marketplace>` (declare + enable + install), then disable
and uninstall `bug-report@<marketplace>`; and rename every configured cascade layer, not just the
team file — `~/.claude/bug-report.md` → `~/.claude/bugs.md`, `.claude/bug-report.md` →
`.claude/bugs.md`, and `.claude/bug-report.local.md` → `.claude/bugs.local.md`, keeping the
overlay gitignored. Historical entries below retain the old name.
The persisted report frontmatter keeps `type: bug-report` unchanged — storage-format identifiers
stay stable across renames (ADR 0013).

## [0.8.0]

### Added
Expand Down
30 changes: 15 additions & 15 deletions plugins/bug-report/README.md → plugins/bugs/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# bug-report
# bugs

A Claude Code plugin for the front of the bug lifecycle — **read-only by default**.
It finds defects and captures them in a structured, five-field report; it does not
fix them, open a PR, or file an issue on its own.

| Skill | What it does |
|---|---|
| `/bug-report:write` | Turns an informal defect description — one you already observed — into the five-field report. |
| `/bug-report:scan` | Hunts for defects **nobody has observed yet** in resting code, verifies each candidate adversarially, and reports what survives. |
| `/bug-report:setup` | `check` inspects both configuration surfaces read-only; `apply` writes the tracked lane config `scan` reads. |
| `/bugs:write` | Turns an informal defect description — one you already observed — into the five-field report. |
| `/bugs:scan` | Hunts for defects **nobody has observed yet** in resting code, verifies each candidate adversarially, and reports what survives. |
| `/bugs:setup` | `check` inspects both configuration surfaces read-only; `apply` writes the tracked lane config `scan` reads. |

Invoke `/bug-report:write <description>` (or let Claude reach for it
Invoke `/bugs:write <description>` (or let Claude reach for it
when you describe a defect). The five fields are:

1. **Title** — present tense, one line
Expand All @@ -31,10 +31,10 @@ when you describe a defect). The five fields are:
- **Routes non-defects away.** Feature requests, investigations, and generic chores
are recognized and pointed elsewhere rather than forced into the bug shape.

## Usage — `/bug-report:write`
## Usage — `/bugs:write`

```text
/bug-report:write [--file] [--quick|--full] [--no-survey] <bug description>
/bugs:write [--file] [--quick|--full] [--no-survey] <bug description>
```

| Flag | Effect |
Expand All @@ -47,12 +47,12 @@ when you describe a defect). The five fields are:

## Hunting bugs nobody has reported yet

`/bug-report:write` needs a defect you already noticed. `/bug-report:scan` needs nothing —
`/bugs:write` needs a defect you already noticed. `/bugs:scan` needs nothing —
no diff, no failing test, no stack trace, no comment marker. It reads resting code and
looks for what is wrong in it.

```text
/bug-report:scan [<path|feature|diff>] [--lane <name>] [--track] [--dry-run]
/bugs:scan [<path|feature|diff>] [--lane <name>] [--track] [--dry-run]
```

| Flag | Effect |
Expand Down Expand Up @@ -90,14 +90,14 @@ Two surfaces with two different owners.
Claude Code owns this value: current releases ignore plugin `userConfig` values placed in
project or local settings, and changes route through Claude Code's own configuration prompt.

**Team — the tracked `.claude/bug-report.md`**, which `/bug-report:scan` reads for its lanes
**Team — the tracked `.claude/bugs.md`**, which `/bugs:scan` reads for its lanes
(`lanes`) and its filing policy (`filing_posture`). It is layered per the marketplace's
config-cascade convention — a user-global file, this tracked team file, and a gitignored local
overlay. All layers are optional: with no config at all, `scan` rotates over bundled generic
default lanes. Keys, defaults, layer order, and per-key merge semantics live in
[`reference/config.md`](reference/config.md), their single home.

Run `/bug-report:setup` to work on either surface. `check` (the default) reports both read-only:
Run `/bugs:setup` to work on either surface. `check` (the default) reports both read-only:
the rendered `output_dir` and which layer supplied each lane config value. `apply` writes the
tracked file and nothing else — it drafts lane candidates from your repository, confirms them one
at a time, and never touches settings, `pluginConfigs`, the local overlay, or your `.gitignore`.
Expand Down Expand Up @@ -128,7 +128,7 @@ Otherwise the emitted report is the deliverable — copy it into your tracker.

```shell
/plugin marketplace add melodic-software/claude-code-plugins
/plugin install bug-report@<marketplace>
/plugin install bugs@<marketplace>
```

<!-- BEGIN GENERATED: plugin options — edit plugin.json, then run scripts/sync-plugin-options-docs.py -->
Expand All @@ -148,12 +148,12 @@ reads it from.
Three supported routes, in the order most people want them:

1. **Interactively** — Claude Code prompts for declared options when you enable the
plugin. To change them later: `/plugin configure bug-report@<marketplace>`.
plugin. To change them later: `/plugin configure bugs@<marketplace>`.
2. **Headless** — repeat `--config` for each option. Replace
`<marketplace>` with the marketplace you installed this plugin from:

```shell
claude plugin install bug-report@<marketplace> -s <scope> --config output_dir=<value>
claude plugin install bugs@<marketplace> -s <scope> --config output_dir=<value>
```

The same command reconfigures a plugin that is **already installed**: it prints
Expand All @@ -177,7 +177,7 @@ Three supported routes, in the order most people want them:
```json
{
"pluginConfigs": {
"bug-report@<marketplace>": {
"bugs@<marketplace>": {
"options": {
"output_dir": <value>
}
Expand Down
Loading