chore(release): finalize changelog and bump version to 3.0.16#795
Conversation
Five sequential plans for the 3.0.16 release cut: provisioning checkpoint, release-prep PR, final dry-run, tag handoff + live-run shepherding, and post-release verification. Runs the Phase 05.4 release machinery; authors only a changelog finalization + one-line VERSION bump. Co-Authored-By: Claude Fable 5 <[email protected]>
- Docker Hub secrets DOCKERHUB_USERNAME/DOCKERHUB_TOKEN verified at repository scope via gh api (org OAT path per D-11) - Initial placement was release-environment scope; docker job declares no environment, so user re-added at repo scope (env copies may remain, harmless shadow duplicates) - PyPI trusted publisher + RTD integration user-confirmed in provider UIs - release env reviewer, testpypi env, Actions-PR setting, stable/3.0.x unprotected: re-verified live 2026-07-13 - Remaining unchecked: ancestry merge (task 3), pre-tag check, testpypi branch restriction (optional hardening), CHANGELOG/VERSION (plan 02)
- User ran the -s ours merge directly on main per D-10 (Pitfall 1: real merge commit, not a squashed/rebased PR) - Verified: merge 8978b39 has two parents (c4dc2df + 0679bf5), merge-base --is-ancestor prints FF-OK, zero content drift across merge - branch-sync fast-forward precondition for REL-03 now holds
Finalize the CHANGELOG.md release-prep section: rename the '3.0.15 - DEVELOPMENT' header to '3.0.16 - July 13, 2026', add a release highlights paragraph (Python 3.10-3.14 matrix, warn-only deprecations with 3.2.0 removals signposted, automated GitHub Actions release workflow, fully-typed cement generate templates), and condense every entry to release-notes altitude while preserving all five buckets and every entry. The D-01 git-log cross-check (3.0.14..HEAD) surfaced three user-visible changes missing from the section, now added: an explicit __all__ for 'from cement import *' (#756), the base GitHub Actions PR CI (#757), and the devbox/direnv development-environment configuration. Bump the single version of record VERSION to (3, 0, 16, 'final', 0) in cement/core/backend.py so get_version() returns '3.0.16'; update the paired tests/core/test_backend.py assertion to match (Rule 1).
📝 WalkthroughWalkthroughThe change documents and coordinates the Phase 6 release cut for 3.0.16, updates the changelog and version constant, records provisioning checks, defines workflow execution plans, and adds post-release verification requirements. It also ignores the ChangesRelease Cut 3.0.16
Estimated code review effort: 3 (Moderate) | ~25 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning Tools execution failed with the following error: Failed to run tools: 13 INTERNAL: Received RST_STREAM with code 2 (Internal server error) 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 |
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (1)
CHANGELOG.md (1)
118-166: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueInconsistent issue reference format across changelog sections.
The Features section uses full markdown links (
[Issue#746](https://github.com/datafolklabs/cement/issues/746)) while Bugs, Refactoring, and Misc sections use plain#NNNreferences (e.g.,—#756``,(#782`)`). Consider normalizing to one style for a polished release-notes appearance.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@CHANGELOG.md` around lines 118 - 166, Normalize issue and pull-request references throughout the changelog sections to one consistent format, matching the full Markdown link style already used in the Features entries. Update the plain references in the Bugs, Refactoring, and Misc sections while preserving each reference’s existing number and destination.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.planning/phases/06-release-cut-3-0-16/06-01-PLAN.md:
- Around line 112-119: The Task 1 verification in the release plan only checks
that the release environment exists. Expand the verification steps to record
Docker secret presence, stable-to-main ancestry, release reviewer details,
ruleset state, and the complete 12-row GREEN/OPEN/UNVERIFIABLE inventory
matching research items `#1`–#12; keep the task incomplete unless all required
outputs are captured.
In @.planning/phases/06-release-cut-3-0-16/06-01-SUMMARY.md:
- Line 72: Revise the summary sentence in the release-cut completion section to
distinguish the two closed hard blockers from all remaining release-gate work.
Do not state that only Plan-02 items remain; acknowledge the outstanding Plan-02
CHANGELOG/VERSION tasks together with the later Plan-04/pre-tag checks and
tag-rule verification.
In @.planning/phases/06-release-cut-3-0-16/06-05-PLAN.md:
- Around line 112-114: Update the release verification step around the
`get_version()` requirement to invoke the installed/public `get_version()`
accessor from outside the checkout and assert that it returns `3.0.17`. Retain
the existing checks for `backend.py` and the `CHANGELOG.md` development header.
- Around line 83-86: Update the REL-04 clean-venv verification instructions to
execute from a temporary directory rather than the repository root, preventing
the local cement package from being imported. Explicitly configure pip to use
production PyPI and disable caching when installing cement==3.0.16, while
preserving the existing import, version assertion, App().run() round-trip, and
deactivation checks.
In @.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md:
- Around line 76-78: Use the authoritative 3.0.16 release date consistently
across both planning artifacts: update the target release header in
.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md (lines 76-78) and the
command example in .planning/phases/06-release-cut-3-0-16/06-RESEARCH.md (lines
253-257) from July 12 to July 13, 2026.
In @.planning/phases/06-release-cut-3-0-16/06-RESEARCH.md:
- Around line 299-305: Update the REL-04 verification command to execute the
required App(argv=[]).run() round-trip instead of guarding it with a false
condition. Keep the existing version assertion and success output, ensuring the
installed cement==3.0.16 package is actually exercised before printing
completion.
In @.planning/phases/06-release-cut-3-0-16/06-VALIDATION.md:
- Around line 1-33: Complete the validation contract in the phase 6 document by
replacing all placeholders with the repository’s actual pytest configuration,
make comply quick command, make test full-suite command, and realistic runtime
and feedback values. Add the required manual release checks and update the
metadata and final sign-off state, including nyquist_compliant and
wave_0_complete, to reflect the already-passed validation gates.
In @.planning/STATE.md:
- Around line 13-16: Synchronize release-progress metadata with the
authoritative roadmap: update .planning/STATE.md lines 13-16 and 36 to reflect
Phase 05.4 complete, Phase 6 at 1/5, and the matching total/completed plan and
phase counts, removing stale 44/45, 9/11, and in-progress values. Preserve
.planning/ROADMAP.md lines 390-391 as the authoritative values unless both files
are updated consistently.
---
Nitpick comments:
In `@CHANGELOG.md`:
- Around line 118-166: Normalize issue and pull-request references throughout
the changelog sections to one consistent format, matching the full Markdown link
style already used in the Features entries. Update the plain references in the
Bugs, Refactoring, and Misc sections while preserving each reference’s existing
number and destination.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: cff4a279-04f4-4594-ba0b-a2226a832ac8
📒 Files selected for processing (19)
.gitignore.planning/ROADMAP.md.planning/STATE.md.planning/phases/05.4-github-actions-release-workflow/05.4-PROVISIONING.md.planning/phases/06-release-cut-3-0-16/06-01-PLAN.md.planning/phases/06-release-cut-3-0-16/06-01-SUMMARY.md.planning/phases/06-release-cut-3-0-16/06-01-provisioning-inventory.md.planning/phases/06-release-cut-3-0-16/06-02-PLAN.md.planning/phases/06-release-cut-3-0-16/06-03-PLAN.md.planning/phases/06-release-cut-3-0-16/06-04-PLAN.md.planning/phases/06-release-cut-3-0-16/06-05-PLAN.md.planning/phases/06-release-cut-3-0-16/06-CONTEXT.md.planning/phases/06-release-cut-3-0-16/06-DISCUSSION-LOG.md.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md.planning/phases/06-release-cut-3-0-16/06-RESEARCH.md.planning/phases/06-release-cut-3-0-16/06-VALIDATION.mdCHANGELOG.mdcement/core/backend.pytests/core/test_backend.py
| <verify> | ||
| <automated>gh api repos/datafolklabs/cement/environments --jq '.environments[].name' | grep -q release</automated> | ||
| </verify> | ||
| <acceptance_criteria> | ||
| - Output records secret presence: DOCKERHUB_USERNAME and DOCKERHUB_TOKEN each shown as SET or ABSENT | ||
| - `git merge-base --is-ancestor origin/stable/3.0.x origin/main` exit code recorded (non-zero == ancestry OPEN) | ||
| - Environment `release` reviewer presence recorded from `gh api .../environments/release` | ||
| - A 12-row state table (GREEN/OPEN/UNVERIFIABLE) is produced for the SUMMARY, matching or updating RESEARCH item numbers #1-#12 |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make Task 1 verification cover its acceptance criteria.
The current command only confirms that a release environment exists; it does not verify the required reviewer, Docker secrets, ancestry result, ruleset state, or the 12-row inventory. Add explicit checks or make the task remain incomplete until those outputs are recorded.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-01-PLAN.md around lines 112 - 119,
The Task 1 verification in the release plan only checks that the release
environment exists. Expand the verification steps to record Docker secret
presence, stable-to-main ancestry, release reviewer details, ruleset state, and
the complete 12-row GREEN/OPEN/UNVERIFIABLE inventory matching research items
`#1`–#12; keep the task incomplete unless all required outputs are captured.
|
|
||
| # Phase 06 Plan 01: Pre-First-Tag Provisioning Summary | ||
|
|
||
| **Both hard release blockers closed — Docker Hub repo secrets set via org OAT and stable/3.0.x ancestry recorded on main via merge 8978b395 — with PyPI trusted publisher and RTD integration user-confirmed, leaving only Plan-02 items (CHANGELOG/VERSION) open on the pre-first-tag checklist.** |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Clarify the remaining release blockers.
This says only Plan 02 items remain open, but the summary later lists Plan 04/pre-tag checks and tag-rule verification as still open. Reword this sentence to distinguish closed blockers from remaining release-gate work.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-01-SUMMARY.md at line 72, Revise
the summary sentence in the release-cut completion section to distinguish the
two closed hard blockers from all remaining release-gate work. Do not state that
only Plan-02 items remain; acknowledge the outstanding Plan-02 CHANGELOG/VERSION
tasks together with the later Plan-04/pre-tag checks and tag-rule verification.
| Run the REL-04 clean-venv check: create a throwaway venv, `pip install | ||
| cement==3.0.16` from production PyPI, import App, assert | ||
| get_version()=='3.0.16', run a minimal App().run() round-trip (mirroring | ||
| scripts/testpypi-smoke.py's SmokeApp(argv=[]) pattern), then deactivate. If the |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make the PyPI verification hermetic.
If this runs from the repository root, the local cement/ directory can shadow the installed package. Also, the venv does not guarantee production PyPI if PIP_INDEX_URL or pip configuration is inherited. Run from a temporary directory and explicitly use production PyPI with caching disabled.
Also applies to: 95-99
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-05-PLAN.md around lines 83 - 86,
Update the REL-04 clean-venv verification instructions to execute from a
temporary directory rather than the repository root, preventing the local cement
package from being imported. Explicitly configure pip to use production PyPI and
disable caching when installing cement==3.0.16, while preserving the existing
import, version assertion, App().run() round-trip, and deactivation checks.
| 3. Agent confirms main advanced: `git fetch origin main && git show | ||
| origin/main:cement/core/backend.py | grep VERSION` shows 3.0.17, and | ||
| `git show origin/main:CHANGELOG.md` top header is `## 3.0.17 - DEVELOPMENT`. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Verify get_version() explicitly after the dev bump.
The must-have requires get_version() to return 3.0.17, but the verification step only greps backend.py. Invoke the installed/public version accessor from outside the checkout and assert the returned value.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-05-PLAN.md around lines 112 - 114,
Update the release verification step around the `get_version()` requirement to
invoke the installed/public `get_version()` accessor from outside the checkout
and assert that it returns `3.0.17`. Retain the existing checks for `backend.py`
and the `CHANGELOG.md` development header.
| ## 3.0.16 - July 12, 2026 | ||
| ``` | ||
| Date format copies the established convention verbatim: `## 3.0.14 - May 5, 2025`. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use one authoritative 3.0.16 release date across the planning artifacts.
The release objective and July 13 provisioning evidence conflict with these July 12 examples. Update both references to the actual release date so the generated changelog and release notes do not carry inconsistent metadata.
.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md#L76-L78: change the target header date to the authoritative release date..planning/phases/06-release-cut-3-0-16/06-RESEARCH.md#L253-L257: update the command example to the same date.
📍 Affects 2 files
.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md#L76-L78(this comment).planning/phases/06-release-cut-3-0-16/06-RESEARCH.md#L253-L257
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md around lines 76 - 78,
Use the authoritative 3.0.16 release date consistently across both planning
artifacts: update the target release header in
.planning/phases/06-release-cut-3-0-16/06-PATTERNS.md (lines 76-78) and the
command example in .planning/phases/06-release-cut-3-0-16/06-RESEARCH.md (lines
253-257) from July 12 to July 13, 2026.
| python -m venv /tmp/cement-rel-check && . /tmp/cement-rel-check/bin/activate | ||
| pip install cement==3.0.16 | ||
| python -c "from cement import App; from cement.utils.version import get_version; \ | ||
| assert get_version()=='3.0.16', get_version(); \ | ||
| App(argv=[]).run() if False else None; print('REL-04 OK', get_version())" | ||
| deactivate | ||
| ``` |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Run the required App().run() round-trip instead of skipping it.
App(argv=[]).run() if False else None always evaluates to None, so this verification only checks installation and version metadata; it never exercises the runtime smoke test required by REL-04.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-RESEARCH.md around lines 299 -
305, Update the REL-04 verification command to execute the required
App(argv=[]).run() round-trip instead of guarding it with a false condition.
Keep the existing version assertion and success output, ensuring the installed
cement==3.0.16 package is actually exercised before printing completion.
| --- | ||
| phase: 6 | ||
| slug: release-cut-3-0-16 | ||
| status: draft | ||
| nyquist_compliant: false | ||
| wave_0_complete: false | ||
| created: 2026-07-12 | ||
| --- | ||
|
|
||
| # Phase 6 — Validation Strategy | ||
|
|
||
| > Per-phase validation contract for feedback sampling during execution. | ||
|
|
||
| --- | ||
|
|
||
| ## Test Infrastructure | ||
|
|
||
| | Property | Value | | ||
| |----------|-------| | ||
| | **Framework** | {pytest 7.x / jest 29.x / vitest / go test / other} | | ||
| | **Config file** | {path or "none — Wave 0 installs"} | | ||
| | **Quick run command** | `{quick command}` | | ||
| | **Full suite command** | `{full command}` | | ||
| | **Estimated runtime** | ~{N} seconds | | ||
|
|
||
| --- | ||
|
|
||
| ## Sampling Rate | ||
|
|
||
| - **After every task commit:** Run `{quick run command}` | ||
| - **After every plan wave:** Run `{full suite command}` | ||
| - **Before `/gsd-verify-work`:** Full suite must be green | ||
| - **Max feedback latency:** {N} seconds |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Complete the validation contract before phase closure.
The file is still an unfilled template with placeholder commands and nyquist_compliant: false, while the PR claims the validation gates already passed. Populate the actual pytest configuration, make comply/make test commands, manual release checks, and final sign-off state.
Also applies to: 47-76
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/phases/06-release-cut-3-0-16/06-VALIDATION.md around lines 1 - 33,
Complete the validation contract in the phase 6 document by replacing all
placeholders with the repository’s actual pytest configuration, make comply
quick command, make test full-suite command, and realistic runtime and feedback
values. Add the required manual release checks and update the metadata and final
sign-off state, including nyquist_compliant and wave_0_complete, to reflect the
already-passed validation gates.
| total_phases: 11 | ||
| completed_phases: 9 | ||
| total_plans: 45 | ||
| completed_plans: 45 | ||
| total_plans: 50 | ||
| completed_plans: 46 |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Synchronize the release-progress counters.
The state files disagree: .planning/ROADMAP.md and 06-01-SUMMARY.md show Phase 05.4 complete and Phase 6 at 1/5, while .planning/STATE.md still says 44/45 plans, 9/11 phases, and Phase 05.4 is in progress. This can cause the planner to resume or gate the wrong phase.
.planning/STATE.md#L13-L16: reconcile the total/completed plan and phase counters with the roadmap..planning/STATE.md#L36-L36: replace the stale 44/45, 9/11, and Phase 05.4-in-progress values..planning/ROADMAP.md#L390-L391: keep the authoritative Phase 05.4-complete and Phase 6 1/5 values, or update both files consistently.
📍 Affects 2 files
.planning/STATE.md#L13-L16(this comment).planning/STATE.md#L36-L36.planning/ROADMAP.md#L390-L391
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.planning/STATE.md around lines 13 - 16, Synchronize release-progress
metadata with the authoritative roadmap: update .planning/STATE.md lines 13-16
and 36 to reflect Phase 05.4 complete, Phase 6 at 1/5, and the matching
total/completed plan and phase counts, removing stale 44/45, 9/11, and
in-progress values. Preserve .planning/ROADMAP.md lines 390-391 as the
authoritative values unless both files are updated consistently.
Phase 6 executed the live 3.0.16 release cut: provisioning session, release-prep PR #795, TestPyPI dry-run baseline (run 29262360749), live tag release (run 29263984129), and post-release close-out. Includes plan summaries, code review (clean), passed VERIFICATION, announcement draft, and deferred items (release.yml checklist fix, RTD trigger check). REL-01..05 / CI-04 / DOCS-03 complete. Co-Authored-By: Claude Fable 5 <[email protected]>
Release prep: 3.0.16
This is the single release-prep PR for the 3.0.16 cut (Phase 06, Plan 02).
It finalizes the changelog and bumps the version of record. The merged
maincommit is what will later be tagged.Changes
3.0.15 - DEVELOPMENTsection into areleased
## 3.0.16 - July 13, 2026section:DEVELOPMENTmarker).Python 3.10–3.14 matrix (3.8/3.9 dropped), warn-only deprecations with
3.2.0 removals signposted, the automated GitHub Actions release
workflow, and fully-typed modernized
cement generatetemplates.five buckets in order (Bugs, Features, Refactoring, Misc, Deprecations)
and every entry (including
[dev]).VERSIONtuple to(3, 0, 16, 'final', 0)soget_version()returns3.0.16(pyproject.toml /
cement/__init__.pyderive the version dynamically).16.D-01 git-log cross-check
Cross-checking
git log 3.0.14..HEAD(after planning-artifact andrevert-pair filtering) against the populated buckets surfaced three
user-visible changes that were missing; they have been added:
[core]explicit__all__forfrom cement import *(fix __all__ #756)[ci]base GitHub Actions PR CI,build_and_test.yml(feat: setup github actions #757)[dev]devbox/direnv development-environment configurationGates (local, green)
make comply— ruff + mypy cleanmake test— 386 passed, 100% coveragemake audit-public-api— public surface byte-identical (exit 0)Notes for reviewer
changelog 3.0.16 section (especially the highlights wording) for
release-notes accuracy.
.planning/. The only non-.planningchanges are the four files above(
.gitignoregained ascratchpad/ignore). Choose the merge methodaccordingly (e.g. squash, or filter
.planning/if you prefer acode-only history on
main).Plan:
.planning/phases/06-release-cut-3-0-16/06-02-PLAN.mdSummary by CodeRabbit
Release
SMTPMailHandler.send()now issues warnings, with removal planned for v3.2.0.Documentation
Tests