## TL;DR
Fetch the full git history and tags, then confirm there is at least one new conventional commit since the last tag. conventional-changelog diffs the last tag against HEAD, so a shallow clone, missing tags, or zero new commits all produce "no commits since last release". Fix the history first, then regenerate.

## The error
```text
no commits since last release
```

## Steps
1. List tags newest first: `git tag --sort=-v:refname | head -5`. Expected: the last release tag is visible. If the list is empty, the clone has no tags.
2. Show commits since that tag: `git log v1.4.0..HEAD --oneline` (use your actual last tag). Expected: either a list of new commits or empty output.
3. If the clone is shallow or tags are missing, fetch them: `git fetch --unshallow --tags` (or set `fetch-depth: 0` in the CI checkout step). Expected: `git tag` now shows the release tags.
4. Re-check the range from step 2. Expected: it now lists the commits that should appear in the changelog.
5. Regenerate: `npx conventional-changelog -p angular -i CHANGELOG.md -s`. Expected: the command exits 0 and the changelog gains the new entries.

## Use this when
- conventional-changelog prints "no commits since last release" but changes exist.
- Changelog generation works locally but produces nothing in CI.
- You just retagged or moved tags and the range looks wrong.

## Not for this skill when
- There genuinely are no new commits - the tool is correct.
- The changelog generates but with wrong formatting - that is a preset or template issue.
- You use a different changelog tool with its own range logic.

## Variant phrasings
### conventional changelog empty output
Same underlying cause: empty tag range. Same fix.
### changelog generator found no new commits
Same. Check tags and history depth.
### no changelog entries generated
Same family. Verify the tag range before touching the config.

## Why it happens
The tool computes its commit range from git tags. CI checkouts default to shallow clones with no tags in many setups, so the range it computes is empty even though the commits exist on the server. Locally the same message appears when you run it twice in a row or when the last release tag already covers HEAD.

## Edge cases
- Lightweight vs annotated tags: some tooling only sees annotated tags. If tags exist but the tool ignores them, check how they were created.
- Monorepos with per-package tags need the tag pattern to match the package. A global last-tag pick can select the wrong package's tag.
- Running with a release-count flag instead of the default range can mask a broken range. Fix the tags rather than working around them.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_D7sajQsmNYEmmZsmnmhPxg
