Skip to content
Merged
Changes from 1 commit
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
8 changes: 7 additions & 1 deletion .claude/skills/release/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,15 @@ Scan **every commit message** between the last tag and HEAD. Apply these rules i
| Condition | Bump |
|-----------|------|
| Any commit has a `BREAKING CHANGE:` or `BREAKING-CHANGE:` footer, **or** uses the `!` suffix (e.g. `feat!:`, `fix!:`, `refactor!:`) | **major** |
| Any commit uses `feat:` or `feat(scope):` | **minor** |
| Any commit uses `feat:` or `feat(scope):` **with a user-facing scope** | **minor** |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Qualifier ambiguity for bare feat: commits

The updated table cell reads: Any commit uses \feat:` or `feat(scope):` with a user-facing scope. The trailing qualifier can be read as applying to both alternatives — implying that even a bare feat:commit (no scope) needs a "user-facing scope" to trigger minor. The intent is clearly that barefeat:is always minor; onlyfeat(scope):` is filtered by the exclusion list.

A small reword prevents the AI from mis-reading this:

Suggested change
| Any commit uses `feat:` or `feat(scope):` **with a user-facing scope** | **minor** |
| Any `feat:` commit **or** any `feat(scope):` where the scope is **not** in the internal list below | **minor** |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. Reworded the table row to: "Any feat: commit or any feat(scope): where the scope is not in the internal list below". This removes the ambiguity — bare feat: is clearly always minor.

| Everything else (`fix:`, `refactor:`, `perf:`, `chore:`, `docs:`, `test:`, `ci:`, etc.) | **patch** |

**Internal scopes — treat as patch, not minor:** The following scopes represent internal developer tooling and infrastructure, not user-facing features. A `feat:` commit with one of these scopes counts as a **patch**, not a minor bump:

`titan`, `skills`, `hooks`, `claude`, `ci`, `bench`, `dogfood`, `release`, `housekeep`, `review`, `deps-audit`, `test-health`, `architect`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 claude scope missing from PR description

The added scope list includes claude (between hooks and ci), but the PR description's summary omits it. If claude is intentionally internal, the PR description should be corrected for traceability; if it was accidentally added, it should be removed from the skill.

Suggested change
`titan`, `skills`, `hooks`, `claude`, `ci`, `bench`, `dogfood`, `release`, `housekeep`, `review`, `deps-audit`, `test-health`, `architect`
`titan`, `skills`, `hooks`, `ci`, `bench`, `dogfood`, `release`, `housekeep`, `review`, `deps-audit`, `test-health`, `architect`

(Remove claude if it wasn't meant to be included, or leave as-is and update the PR description.)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The \ scope is intentional — commits like \ are internal tooling, not user-facing features. I've kept it in the list and alphabetized all scopes for easier maintenance (addressing Claude bot's suggestion as well).


For example, `feat(titan): first full pipeline run` is internal tooling — patch. But `feat(cfg): control-flow graph generation` is user-facing — minor.

Given the current version `MAJOR.MINOR.PATCH` from `package.json`, compute the new version:
- **major** → `(MAJOR+1).0.0`
- **minor** → `MAJOR.(MINOR+1).0`
Expand Down
Loading