Skip to content

Open the 0.1.0 release cycle - #403

Merged
Bronek merged 17 commits into
mainfrom
bronek/release_0_1
Aug 23, 2026
Merged

Open the 0.1.0 release cycle#403
Bronek merged 17 commits into
mainfrom
bronek/release_0_1

Conversation

@Bronek

@Bronek Bronek commented Aug 18, 2026

Copy link
Copy Markdown
Member

Tagging v0.1.0-rc1 left main claiming a version it no longer is. VERSION reaches include/libfn_version.hpp as LIBFN_VERSION — the inline namespace — so until it moves, every commit here builds headers spelling the released namespace while carrying unreleased content. Two such builds link cleanly and are ODR-incompatible, and nothing diagnoses it. Bumping now closes that window; it also aligns VERSION with the CHANGELOG, whose top entry already reads 0.1.0.

Five places consume the version. CMakeLists.txt and conanfile.py read the VERSION file, so they follow automatically; MODULE.bazel, ports/libfn/vcpkg.json and include/libfn_version.hpp each carry it independently and are updated here. No reference to rc1 survives outside CHANGELOG history.

Changes:

  • ceba6ab updates VERSION file and associated files (see above)
  • 70e2491 adds the versioned documentation site (Harden the release procedure before 0.1.0 #402 §4): each release also exports its docs under /v<x.y.z>/, assembled with every previously released version from the libfn/website archive and pushed back there on release deploys. The scripts are covered by the pipeline's own loud guards plus an out-of-repo harness run against the deployed rc1 tree (byte-exact round-trips) — ctest cannot exercise them, lacking znai's output; this PR's docs run is the first end-to-end execution.
  • ac95884 rejects SemVer-invalid prerelease identifiers in CMake and site assembly
  • 124a8cf skips the expensive CI jobs on draft pull requests; flipping to ready-for-review runs exactly what was skipped
  • 4b51d52 hardens docs.yml for release deploys (Harden the release procedure before 0.1.0 #402 §2): unconditional release redeploys, full-depth tags for git describe, serialized Pages deploys, the github-pages environment declared
  • 2d8579b attests build provenance of the published single header (Harden the release procedure before 0.1.0 #402 §6); gh attestation verify checks a downloaded copy
  • Documentation, over several commits: the release procedure and version cadence in CONTRIBUTING (Harden the release procedure before 0.1.0 #402 §§1, 5, 8), the single-header distribution channels and their contracts in README (Harden the release procedure before 0.1.0 #402 §4), the CHANGELOG summarized for release (the rc1 entry retitled, a 0.1.0 entry carrying the delta), and README/CONTRIBUTING polish — badges, and the usage docs split into dependency and single-header sections.

Remaining follow-ups from the rc1 dry run — the vcpkg port and the v* tag ruleset — stay tracked in #402.

Assisted-by: Claude:claude-opus-5
Assisted-by: Claude:claude-fable-5
Assisted-by: Gemini:gemini-3.6-flash

@codecov

codecov Bot commented Aug 18, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

znai deploys to <deploy>/<doc-id> and prefixes every internal URL with
the doc id, so a second export pass whose doc id names the version
directory yields a self-consistent copy under v<version>/ beside the
unchanged root. fix_site_urls.py grows a doc-id mode: verify the
prefix on every link (failing on any without it), repair the stubs,
and pin GitHub source links to the release tag a permanent tree
documents.

The deployed site joins the fresh build with every previously released
version, kept in libfn/website: generate_docs assembles from a public
clone, so the PR artifact is the complete future site; a separate
push_archive job (the only holder of WEBSITE_PUSH_TOKEN) pushes each
release deploy back to the archive before it goes live. Runs serialize
per ref, an assembly that drops an archived version's files refuses,
and an archived version's content is immutable once tagged.

README directs single-header users to the per-version permalinks and
the versions.html index; the moving /libfn.hpp remains, labelled as
moving. v0.1.0-rc1's site is preserved only as libfn/website's tag -
the versioned pipeline starts at 0.1.0. The scripts were verified
against the deployed rc1 tree in an out-of-repo harness (byte-exact
round-trips); the pipeline's loud guards are the in-repo test surface.

Assisted-by: Claude:claude-fable-5
@Bronek

Bronek commented Aug 21, 2026

Copy link
Copy Markdown
Member Author

augment review

@augmentcode

augmentcode Bot commented Aug 21, 2026

Copy link
Copy Markdown
🤖 Augment PR Summary

Summary: Opens the final 0.1.0 release cycle and adds release-scoped documentation publishing.

Changes:

  • Promotes the canonical version from 0.1.0-rc1 to 0.1.0 in the version file, ABI namespaces, Bazel module, and vcpkg manifest.
  • Aligns CMake’s SemVer validation with the canonical prerelease grammar, including rejection of leading-zero numeric identifiers.
  • Generates both the live documentation root and an immutable /v<version>/ copy, including the single-header artifact.
  • Assembles release docs with prior archived versions, publishes the archive to libfn/website, and serializes deployments.
  • Requires an exact release tag before archiving or deploying documentation, preventing an untagged release branch push from consuming a version name.
  • Pins versioned documentation source links to the release tag and validates prefixed internal links.
  • Skips expensive CI, package, coverage, Sonar, and single-header checks while pull requests are drafts; ready-for-review restores them.
  • Attests single-header release assets with GitHub build provenance before attaching them to releases.
  • Expands contributor and README documentation for release procedures, versioning, distribution channels, C++26 mode, and documentation tooling.
  • Updates the changelog to distinguish the final release from the release candidate.
Technical Notes: The Pages artifact is built only from tagged release commits; the archive tag protects already-published version content from mutation.

🤖 Was this summary useful? React with 👍 or 👎

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review completed. 1 suggestion posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

Comment thread scripts/assemble_site.py
SemVer 2.0.0 forbids leading-zero numeric prerelease identifiers;
scripts/sync_versions.py (pre-commit) rejects them, but CMakeLists.txt
and scripts/assemble_site.py accepted e.g. 0.1.0-01, so a bypassed
pre-commit run could publish and tag an invalid version directory.
Both now enforce the canonical grammar — CMake's regex flavor fits it
in exactly its nine-group maximum. Verified by a 22-case corpus probed
against all three validators, sync_versions.py as oracle.

Addresses PR #403 review r3833446766.

Assisted-by: Claude:claude-fable-5
@Bronek

Bronek commented Aug 21, 2026

Copy link
Copy Markdown
Member Author

augment review

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review completed. No suggestions at this time.

Comment augment review to trigger a new review at any time.

Bronek added 6 commits August 22, 2026 20:35
Every push to a draft ran the full matrix on paid runners before anyone
asked for review. The paid jobs (build, package tests, codecov,
sonarcloud, single-header verify) now skip while the pull request is a
draft, and ready_for_review is added to their triggers so flipping to
ready runs what was skipped. Pre-commit, the licence diff and the docs
build still run on drafts, so a cheap correctness check remains. A run
with all jobs skipped concludes 'skipped', which keeps the pr-scan
consumers idle.

No test: draft semantics only exist on real pull request events, so
PR #403 is the live probe.

Assisted-by: Claude:claude-fable-5
The four fixes from #402 section 2. The release push trigger loses its
paths filter, so a release merge always redeploys regardless of what
the delta touched. The checkout fetches full history, so the banner's
git describe still resolves after release moves past the tagged commit.
The Pages deploy gets its own concurrency group with cancellation off,
job-level so pull request builds keep their per-ref group. deploy_docs
declares the github-pages environment, failing a branch-policy
rejection before any step runs and surfacing the live URL.

No test: the deploy leg only runs on a release push; the next release
exercises it. Pull request runs prove generate_docs unaffected.

Assisted-by: Claude:claude-fable-5
Covers #402 sections 1, 5, 8 and 6. Records the smallest-bump version
cadence, tag-and-push sequence, post-deploy checks, step rationales,
and the repository prerequisites.

Assisted-by: Gemini:gemini-3.6-flash
Assisted-by: Claude:claude-fable-5
* Remove passive narrative constructions and conversational preambles
* Expose testing dimensions, compiler assertions, and pipeline pitfalls in structured, bold-lead bullet points
* Absorb and refine C++23/26 compiler exception baselines in Development Environment
* Clarify client code best-practices, header layers, and repository secrets
* Format website references using clean reference links

Assisted-by: Gemini:gemini-3.6-flash
* Add draft entry and previous SHA pointer to CHANGELOG.md
* Incorporate user-refined options for C++26 and compiler overrides
* Restructure Releasing sections to define draft-to-publish playbook
* Fix link reference mappings at bottom of CONTRIBUTING.md

Assisted-by: Gemini:gemini-3.6-flash
* Rephrase the Why section to be active and direct
* Explicitly document the lack of GCC/Clang portability and type limits in the default type-sorting mode
* Add Latest Release and Website badges to the top banner

Assisted-by: Gemini:gemini-3.6-flash
@Bronek
Bronek force-pushed the bronek/release_0_1 branch from a44d871 to f50f942 Compare August 23, 2026 16:26
Bronek added 5 commits August 23, 2026 17:50
The publish job signs SLSA build provenance for libfn-v<tag>.hpp before
uploading, so an attached asset always carries an attestation; a download
is checked with `gh attestation verify`. Untestable before a release:
the job runs only on `release: published`, so first contact is the next
release publish.

Assisted-by: Claude:claude-fable-5
The README named all three distribution channels in one sentence but
stated no contract for any of them; #402 asks that consumers can pick
deliberately. One list item per channel: the versioned site copy is
the immutable URL to pin, the release asset adds verifiable build
provenance, the root URL moves with each release.

Assisted-by: Claude:claude-fable-5
Four bullets carry the rc1-to-release delta: the versioned docs site,
provenance on the single-header asset, the documented release procedure
and cadence, and the draft pull request gating. The rc1 entry keeps the
full library description, dated headings settle on the em dash, and the
previous-changelog pointer now says what its link holds.

Assisted-by: Claude:claude-fable-5
README's Using-the-library chapter gains the two sub-headings, opens
the single-header section with the steer towards real headers, and
groups the practicalities after the channel contracts. CONTRIBUTING
lists both spellings of the C++26 entry point: the exported
libfn::fn_cxx26 and the in-tree include_fn_cxx26.

Assisted-by: Claude:claude-fable-5
@Bronek
Bronek marked this pull request as ready for review August 23, 2026 17:46

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review completed. 2 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

Comment thread CONTRIBUTING.md Outdated
Comment thread .github/workflows/docs.yml
target_compile_features needs PRIVATE for the consumer's own sources —
INTERFACE reaches only dependents, leaving the target itself at its
prior standard. The CI docs page still claimed the site publishes from
main, and its opening sentence predated the draft gating.

Assisted-by: Claude:claude-fable-5
@Bronek

Bronek commented Aug 23, 2026

Copy link
Copy Markdown
Member Author

augment review

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review completed. 2 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

Comment thread .github/workflows/docs.yml
Comment thread CONTRIBUTING.md
An untagged push to release would archive and tag v<VERSION> in
libfn/website with wrong-banner content, and the immutability guard
would then block the real release. generate_docs now fails fast unless
HEAD carries the exact v<VERSION> tag. Also corrects CONTRIBUTING's
sanitizer paragraph: they default ON when the build type is Debug or
unset, not Debug alone. Both are review findings; the guard's failure
path is reachable only by an untagged release push, so it ships
untested by design.

Assisted-by: Claude:claude-fable-5
@Bronek

Bronek commented Aug 23, 2026

Copy link
Copy Markdown
Member Author

augment review

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review completed. 1 suggestion posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

Comment thread CONTRIBUTING.md Outdated
The release-branch clause read as a claim that namespace derivation
inspects branches, which it does not. Split by prerelease kind instead:
candidates are uniquely numbered, so mixing two fails at the linker;
-dev builds share one spelling, which is the silent hazard the release
cadence exists to close. Review finding.

Assisted-by: Gemini:gemini-3.6-flash
@Bronek

Bronek commented Aug 23, 2026

Copy link
Copy Markdown
Member Author

augment review

@augmentcode augmentcode Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review completed. No suggestions at this time.

Comment augment review to trigger a new review at any time.

@sonarqubecloud

Copy link
Copy Markdown

@Bronek
Bronek merged commit f9f9284 into main Aug 23, 2026
73 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant