From de20228c2ca1f3f32dbbada82a08f1229834a7b5 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Thu, 26 Mar 2026 17:56:32 -0600 Subject: [PATCH] fix: /ship CHANGELOG and PR body now cover all branch commits (v0.12.4.0) (#535) * fix: /ship CHANGELOG and PR body now cover all branch commits Step 5 (CHANGELOG generation) restructured to force explicit commit enumeration, theme grouping, and cross-check before writing. Step 8 (PR body) changed from "bullet points from CHANGELOG" to commit-by-commit coverage with logical sections. Fixes recency bias that dropped early commits on long branches. * chore: bump version and changelog (v0.12.3.0) Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- CHANGELOG.md | 9 +++++++++ TODOS.md | 12 ++++++++++++ VERSION | 2 +- ship/SKILL.md | 36 +++++++++++++++++++++++++++++++----- ship/SKILL.md.tmpl | 36 +++++++++++++++++++++++++++++++----- 5 files changed, 84 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 899b3b8eebe4fc93573cfbfe94230c94602b8528..0769d7d8ea420767a7a89e064b0ce2a463c001a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.12.4.0] - 2026-03-26 — Full Commit Coverage in /ship + +When you ship a branch with 12 commits spanning performance work, dead code removal, and test infra, the PR should mention all three. It wasn't. The CHANGELOG and PR summary biased toward whatever happened most recently, silently dropping earlier work. + +### Fixed + +- **/ship Step 5 (CHANGELOG):** Now forces explicit commit enumeration before writing. You list every commit, group by theme, write the entry, then cross-check that every commit maps to a bullet. No more recency bias. +- **/ship Step 8 (PR body):** Changed from "bullet points from CHANGELOG" to explicit commit-by-commit coverage. Groups commits into logical sections. Excludes the VERSION/CHANGELOG metadata commit (bookkeeping, not a change). Every substantive commit must appear somewhere. + ## [0.12.3.0] - 2026-03-26 — Voice Directive: Every Skill Sounds Like a Builder Every gstack skill now has a voice. Not a personality, not a persona, but a consistent set of instructions that make Claude sound like someone who shipped code today and cares whether the thing works for real users. Direct, concrete, sharp. Names the file, the function, the command. Connects technical work to what the user actually experiences. diff --git a/TODOS.md b/TODOS.md index 8458a98ae109a7b072f522f1a852c63755e5dbdb..819ff02d7321fc13bbf932b16533551299d2fc9a 100644 --- a/TODOS.md +++ b/TODOS.md @@ -221,6 +221,18 @@ Linux cookie import shipped in v0.11.11.0 (Wave 3). Supports Chrome, Chromium, B **Priority:** P2 **Depends on:** None (BASE_BRANCH_DETECT multi-platform resolver is already done) +### Multi-commit CHANGELOG completeness eval + +**What:** Add a periodic E2E eval that creates a branch with 5+ commits spanning 3+ themes (features, cleanup, infra), runs /ship's Step 5 CHANGELOG generation, and verifies the CHANGELOG mentions all themes. + +**Why:** The bug fixed in v0.11.22 (garrytan/ship-full-commit-coverage) showed that /ship's CHANGELOG generation biased toward recent commits on long branches. The prompt fix adds a cross-check, but no test exercises the multi-commit failure mode. The existing `ship-local-workflow` E2E only uses a single-commit branch. + +**Context:** Would be a `periodic` tier test (~$4/run, non-deterministic since it tests LLM instruction-following). Setup: create bare remote, clone, add 5+ commits across different themes on a feature branch, run Step 5 via `claude -p`, verify CHANGELOG output covers all themes. Pattern: `ship-local-workflow` in `test/skill-e2e-workflow.test.ts`. + +**Effort:** M +**Priority:** P3 +**Depends on:** None + ### Ship log — persistent record of /ship runs **What:** Append structured JSON entry to `.gstack/ship-log.json` at end of every /ship run (version, date, branch, PR URL, review findings, Greptile stats, todos completed, test results). diff --git a/VERSION b/VERSION index 47516518975dc11bc2a4a882f5944c5de6ccb113..01bd748cdecf6929021ccd19f7ae0b16641cc28e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.12.3.0 +0.12.4.0 diff --git a/ship/SKILL.md b/ship/SKILL.md index 7418d93b26d03e29454c6e20e8d3de3597cc53c9..6d8f3b6afd0002cf0dc2a1e0e7377e88ac7b2a76 100644 --- a/ship/SKILL.md +++ b/ship/SKILL.md @@ -1590,10 +1590,26 @@ High-confidence findings (agreed on by multiple sources) should be prioritized f 1. Read `CHANGELOG.md` header to know the format. -2. Auto-generate the entry from **ALL commits on the branch** (not just recent ones): - - Use `git log ..HEAD --oneline` to see every commit being shipped - - Use `git diff ...HEAD` to see the full diff against the base branch - - The CHANGELOG entry must be comprehensive of ALL changes going into the PR +2. **First, enumerate every commit on the branch:** + ```bash + git log ..HEAD --oneline + ``` + Copy the full list. Count the commits. You will use this as a checklist. + +3. **Read the full diff** to understand what each commit actually changed: + ```bash + git diff ...HEAD + ``` + +4. **Group commits by theme** before writing anything. Common themes: + - New features / capabilities + - Performance improvements + - Bug fixes + - Dead code removal / cleanup + - Infrastructure / tooling / tests + - Refactoring + +5. **Write the CHANGELOG entry** covering ALL groups: - If existing CHANGELOG entries on the branch already cover some commits, replace them with one unified entry for the new version - Categorize changes into applicable sections: - `### Added` — new features @@ -1604,6 +1620,11 @@ High-confidence findings (agreed on by multiple sources) should be prioritized f - Insert after the file header (line 5), dated today - Format: `## [X.Y.Z.W] - YYYY-MM-DD` +6. **Cross-check:** Compare your CHANGELOG entry against the commit list from step 2. + Every commit must map to at least one bullet point. If any commit is unrepresented, + add it now. If the branch has N commits spanning K themes, the CHANGELOG must + reflect all K themes. + **Do NOT ask the user to describe changes.** Infer from the diff and commit history. --- @@ -1741,7 +1762,12 @@ The PR/MR body should contain these sections: ``` ## Summary - +..HEAD --oneline` to enumerate +every commit. Exclude the VERSION/CHANGELOG metadata commit (that's this PR's bookkeeping, +not a substantive change). Group the remaining commits into logical sections (e.g., +"**Performance**", "**Dead Code Removal**", "**Infrastructure**"). Every substantive commit +must appear in at least one section. If a commit's work isn't reflected in the summary, +you missed it.> ## Test Coverage diff --git a/ship/SKILL.md.tmpl b/ship/SKILL.md.tmpl index 7f545cd97a6fe77bc5504329c34934bc10e63393..6cbe66bda4310f62b5a2bfb4a44ad568e31b4b3e 100644 --- a/ship/SKILL.md.tmpl +++ b/ship/SKILL.md.tmpl @@ -339,10 +339,26 @@ For each classified comment: 1. Read `CHANGELOG.md` header to know the format. -2. Auto-generate the entry from **ALL commits on the branch** (not just recent ones): - - Use `git log ..HEAD --oneline` to see every commit being shipped - - Use `git diff ...HEAD` to see the full diff against the base branch - - The CHANGELOG entry must be comprehensive of ALL changes going into the PR +2. **First, enumerate every commit on the branch:** + ```bash + git log ..HEAD --oneline + ``` + Copy the full list. Count the commits. You will use this as a checklist. + +3. **Read the full diff** to understand what each commit actually changed: + ```bash + git diff ...HEAD + ``` + +4. **Group commits by theme** before writing anything. Common themes: + - New features / capabilities + - Performance improvements + - Bug fixes + - Dead code removal / cleanup + - Infrastructure / tooling / tests + - Refactoring + +5. **Write the CHANGELOG entry** covering ALL groups: - If existing CHANGELOG entries on the branch already cover some commits, replace them with one unified entry for the new version - Categorize changes into applicable sections: - `### Added` — new features @@ -353,6 +369,11 @@ For each classified comment: - Insert after the file header (line 5), dated today - Format: `## [X.Y.Z.W] - YYYY-MM-DD` +6. **Cross-check:** Compare your CHANGELOG entry against the commit list from step 2. + Every commit must map to at least one bullet point. If any commit is unrepresented, + add it now. If the branch has N commits spanning K themes, the CHANGELOG must + reflect all K themes. + **Do NOT ask the user to describe changes.** Infer from the diff and commit history. --- @@ -490,7 +511,12 @@ The PR/MR body should contain these sections: ``` ## Summary - +..HEAD --oneline` to enumerate +every commit. Exclude the VERSION/CHANGELOG metadata commit (that's this PR's bookkeeping, +not a substantive change). Group the remaining commits into logical sections (e.g., +"**Performance**", "**Dead Code Removal**", "**Infrastructure**"). Every substantive commit +must appear in at least one section. If a commit's work isn't reflected in the summary, +you missed it.> ## Test Coverage