Repository navigation
chore(changelog): adopt --respect-item-release and bump pm-changelog to 2026.7.24 - #14
Conversation
…to 2026.7.24 pm-changelog 2026.7.24 adds `--respect-item-release`, which makes the single-window generation path honour an item's declared `release` field instead of trusting `closed_at`. `--all-release-tags` already keyed off that field; this flag makes `changelog`, `changelog:check` and the release notes agree with it. Why it matters here: when a fix ships in one release and its tracker is closed during a later one, plain `closed_at` attribution dates months-old work as new. That is precisely why shipped-but-unclosed trackers pile up — closing them corrupts the changelog. With the flag adopted, late closure is safe. - `changelog`, `changelog:full`, `changelog:check`, `release:notes`: pass `--respect-item-release` - `pm-changelog` devDependency -> `^2026.7.24` Verified: regenerating with the flag active produces a zero-line CHANGELOG.md diff (no item in this repo declares a release yet), and `changelog:check` exits 0 — the flag is a safe no-op until release attribution is actually used.
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Warning Review limit reached
Next review available in: 59 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@greptileai review /gemini review @coderabbitai full review Context for reviewers — this is one repo of a 16-repo fleet-wide rollout, so the diff is deliberately narrow and identical in shape everywhere:
Not in scope: the package |
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '--- PR diff summary ---'
git diff --stat HEAD^ HEAD
echo
echo '--- PR diff ---'
git diff --no-ext-diff --unified=80 HEAD^ HEAD
echo
echo '--- Candidate manifests and lockfiles ---'
fd -HI '^(package\.json|package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock)$' . -E node_modules -E .git
echo
echo '--- All pm-changelog script/config references ---'
rg -n -C 4 --hidden -g '!node_modules/**' -g '!.git/**' -e 'pm-changelog' -e 'respect-item-release' .
echo
echo '--- PM item release-field search ---'
rg -n -i -C 2 --hidden -g '!node_modules/**' -g '!.git/**' '(^|[[:space:],{])release[[:space:]]*[:=]' .agents 2>/dev/null || trueLength of output: 175744
The package scripts themselves are correct: all four have the flag, and One non-blocking note: the “no item declares a |
…hangelog invocations The daily release workflow calls `npx pm-changelog` directly three times (changelog generation, --check, and release notes) rather than going through the npm scripts. Patching only package.json therefore left the path that actually produces the published CHANGELOG.md and RELEASE_NOTES.md on the old semantics while `release:check` validated with the new flag — a latent disagreement between generation and validation. All three invocations now pass --respect-item-release, matching the scripts. Found by Greptile review on the pm-presets PR of this same rollout, then confirmed and applied fleet-wide.
Reviewer status acknowledgement (round 1)Every bot comment on this PR has been read and voted. Recording what each one contributed so the signal is not lost:
CI gates that did run and pass: @coderabbitai full review |
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Your plan includes PR reviews subject to rate limits. More reviews will be available in 33 minutes. |
Reviewer acknowledgement (round 2) — fleet-wide invariant verifiedThis PR is one of 16 parallel changes rolling Invariant: every Verified across all 16 repos:
Findings this round: one P1 from @greptileai on Reviewer status: @gemini-code-assist is sunset and posts only a notice (downvoted as non-actionable). @sourcery-ai is over its weekly 500k diff-character limit. @coderabbitai was rate-limited during round 1 and is re-requested below. Bot feedback that would be genuinely valuable here: anything showing a @coderabbitai full review |
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '--- Changed files and diff against PR base ---'
git diff --name-status "$(git merge-base HEAD origin/main 2>/dev/null || git rev-parse HEAD^)" HEAD || true
git diff --no-ext-diff --unified=30 "$(git merge-base HEAD origin/main 2>/dev/null || git rev-parse HEAD^)" HEAD -- \
package.json package-lock.json .github/workflows/release.yml 2>/dev/null || true
echo
echo '--- Relevant file map ---'
fd -HI '^(package\.json|package-lock\.json|release\.yml|release\.yaml)$' . \
-E .git -E node_modules
echo
echo '--- Repository-wide pm-changelog / flag references (with context) ---'
rg -n -i -C 5 --hidden \
-g '!node_modules/**' -g '!.git/**' \
-e '\b(?:npx\s+)?pm-changelog\b' \
-e -- '--respect-item-release' \
.
echo
echo '--- package.json scripts and dependency declaration ---'
if [ -f package.json ]; then
jq '{
scripts: (.scripts | with_entries(select(.value | test("pm-changelog")))),
devDependency: .devDependencies["pm-changelog"]
}' package.json
fi
echo
echo '--- Lockfile pm-changelog package entries ---'
if [ -f package-lock.json ]; then
jq -r '
.packages
| to_entries[]
| select(.key == "node_modules/pm-changelog")
| "\(.key): \(.value.version // "missing")"
' package-lock.json
fi
echo
echo '--- Direct executable invocations lacking the flag on their command line or continuation block ---'
python3 - <<'PY'
from pathlib import Path
import re
for path in Path(".").rglob("*"):
if any(part in {".git", "node_modules"} for part in path.parts) or not path.is_file():
continue
try:
lines = path.read_text(encoding="utf-8").splitlines()
except UnicodeDecodeError:
continue
for i, line in enumerate(lines):
if re.search(r'\b(?:npx\s+)?pm-changelog\b', line):
block = line
j = i
while block.rstrip().endswith("\\") and j + 1 < len(lines):
j += 1
block += "\n" + lines[j]
status = "FLAGGED" if "--respect-item-release" in block else "MISSING"
print(f"{status}: {path}:{i+1}\n{block}\n")
PYLength of output: 16974 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '--- Repository-wide pm-changelog and flag references ---'
rg -n -i -C 4 --hidden \
-g '!node_modules/**' -g '!.git/**' \
-e '\b(?:npx\s+)?pm-changelog\b' \
-e -- '--respect-item-release' \
.
echo
echo '--- Logical executable pm-changelog command blocks ---'
python3 - <<'PY'
from pathlib import Path
import re
exclude = {".git", "node_modules"}
for path in sorted(Path(".").rglob("*")):
if not path.is_file() or exclude.intersection(path.parts):
continue
try:
lines = path.read_text(encoding="utf-8").splitlines()
except (UnicodeDecodeError, OSError):
continue
for i, line in enumerate(lines):
if not re.search(r'\b(?:npx\s+)?pm-changelog\b', line):
continue
block = line
j = i
while block.rstrip().endswith("\\") and j + 1 < len(lines):
j += 1
block += "\n" + lines[j]
kind = "FLAGGED" if "--respect-item-release" in block else "UNFLAGGED"
print(f"{kind} {path}:{i + 1}")
print(block)
print()
PY
echo '--- Resolved peer-dependency compatibility ---'
jq -r '
.packages as $p |
[
"pm-changelog=" + ($p["node_modules/pm-changelog"].version // "MISSING"),
"pm-changelog peer `@unbrained/pm-cli`=" + ($p["node_modules/pm-changelog"].peerDependencies["`@unbrained/pm-cli`"] // "MISSING"),
"`@unbrained/pm-cli`=" + ($p["node_modules/@unbrained/pm-cli"].version // "MISSING")
] | .[]
' package-lock.json
echo
echo '--- Changed PM item metadata ---'
for file in .agents/pm/chores/pm-github-w7m7.toon .agents/pm/history/pm-github-w7m7.jsonl; do
if [ -f "$file" ]; then
echo "### $file"
sed -n '1,220p' "$file"
fi
doneLength of output: 2511 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '--- Repository-wide pm-changelog and flag references ---'
rg -n -i -C 4 --hidden \
-g '!node_modules/**' -g '!.git/**' \
-e '\b(?:npx\s+)?pm-changelog\b' \
-e '\-\-respect-item-release' \
.
echo
echo '--- Logical executable pm-changelog command blocks ---'
python3 - <<'PY'
from pathlib import Path
import re
exclude = {".git", "node_modules"}
matches = 0
unflagged = 0
for path in sorted(Path(".").rglob("*")):
if not path.is_file() or exclude.intersection(path.parts):
continue
try:
lines = path.read_text(encoding="utf-8").splitlines()
except (UnicodeDecodeError, OSError):
continue
for i, line in enumerate(lines):
if not re.search(r'\b(?:npx\s+)?pm-changelog\b', line):
continue
matches += 1
block = line
j = i
while block.rstrip().endswith("\\") and j + 1 < len(lines):
j += 1
block += "\n" + lines[j]
flagged = "--respect-item-release" in block
if not flagged:
unflagged += 1
print(f"{'FLAGGED' if flagged else 'UNFLAGGED'} {path}:{i + 1}")
print(block)
print()
print(f"SUMMARY invocations={matches} unflagged={unflagged}")
PY
echo
echo '--- Resolved peer-dependency compatibility ---'
jq -r '
.packages as $p |
[
"pm-changelog=" + ($p["node_modules/pm-changelog"].version // "MISSING"),
"pm-changelog peer `@unbrained/pm-cli`=" + ($p["node_modules/pm-changelog"].peerDependencies["`@unbrained/pm-cli`"] // "MISSING"),
"`@unbrained/pm-cli`=" + ($p["node_modules/@unbrained/pm-cli"].version // "MISSING")
] | .[]
' package-lock.json
echo
echo '--- Changed PM item metadata ---'
for file in .agents/pm/chores/pm-github-w7m7.toon .agents/pm/history/pm-github-w7m7.jsonl; do
if [ -f "$file" ]; then
echo "### $file"
sed -n '1,220p' "$file"
fi
doneLength of output: 129881
I found seven executable
The remaining search hits are documentation, PM tracker/history text, source comments, or lockfile metadata—not executable paths. Dependency resolution is compatible as well: the lockfile resolves both Non-blocking note: the new chore metadata still says no item declares ✅ Action performedFull review finished. Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 59 minutes. |
What
Adopts pm-changelog 2026.7.24's
--respect-item-releasein every changelog script, and bumps thepm-changelogdevDependency to^2026.7.24.Why
By default an item lands in the release window containing its
closed_at. In a multi-agent workflow an agent often ships the fix in one release and closes the tracker during a later one, which dates months-old work as new — and is exactly why shipped-but-unclosed trackers accumulate: closing them corrupts the changelog.--all-release-tagsalready honoured each item's declaredreleasefield. This flag makes the single-window path (--since-previous-tag --until-release-tag,changelog:check, release notes) agree with it, so a late tracker closure is safe.Changes
changelog,changelog:full,changelog:check,release:notes→ pass--respect-item-releasepm-changelogdevDependency →^2026.7.24Verification
pm-changelog2026.7.24 installed and used for the regenerationnpm run changelog:fullwith the flag active → zero-lineCHANGELOG.mddiff, confirming the flag is a safe no-op until an item actually declares areleasenpm run changelog:check→ exit 0pm items
pm-github-w7m7— Adopt--respect-item-releasein changelog scripts and bump pm-changelog to 2026.7.24Part of a fleet-wide rollout tracked in the pm ecosystem hub (companion item
pm-cli-website-g58p).Summary by cubic
Adopt
--respect-item-releaseacross all changelog scripts and the release workflow, and upgradepm-changelogto^2026.7.24.All generation and checks now honor each item's
releasefield instead ofclosed_at, aligning single-window and multi-release paths and preventing misdated entries when trackers close late.Written for commit 8bfd23e. Summary will update on new commits.