Skip to content

Cut 0.1.0 release #650

Description

@DavidCozens

Release checklist for the first stable tag.

Route: curated 0.1.0, release-please takes over at 0.2.0

Decided 2026-08-17. This issue previously described release-please cutting
0.1.0 itself, which contradicted the unpark steps in
.github/workflows/release-please.yml and could not work: seeding
.release-please-manifest.json to 0.1.0 tells release-please that 0.1.0 has
already shipped, so its next pull request would propose 0.2.0. The two are now
reconciled in favour of the workflow's version.

Why, with the numbers. The parked comment says a generated changelog over all
of main would overflow GitHub's pull-request body limit. Measured on 2026-08-17:
426 entries across the six configured sections — 169 feat, 92 docs, 51
refactor, 47 ci, 42 chore, 25 fix — plus a breaking-changes block from 9
! commits. At roughly 150 characters an entry that is about 64,000 characters
against a 65,536 limit. The parking was right by a margin of about 2%.

The curated route also gives 0.1.0 the release notes it deserves. A generated list
of 426 commits is not what someone deciding whether to adopt the library needs to
read.

Sequence

  1. All other 0.1.0-milestone blockers closed — S23.22 (S23.22: final documentation and comment quality gate before 0.1.0 #708) is the last one

  2. Public API freeze reviewed — Public API freeze review before 0.1.0 #652, closed 2026-07-20

  3. Pre-cut documentation sweep (see below)

  4. Write the 0.1.0 release notes by hand, to the shape now stated in
    docs/release-process.md (What the release notes contain). For 0.1.0
    that is parts 1 and 2 only — no generated list, because it is the first
    release and every commit since the repository began describes the library
    rather than a change to it.

    **Say so inside the entry**, in one line: this is the first release, so
    everything in it is new and there is no list of changes. That is the only
    permanent home the exception needs. `docs/release-process.md` describes the
    recurring process and deliberately does not mention 0.1.0 — nobody cuts it
    twice — and this issue closes, so the entry has to explain itself to a
    reader who meets a prose entry followed by generated ones.
    - *What's in this release* — what the library is and the deliberate scope
      (source-only, no dynamic allocation), then the compliance snapshot and
      the platform list. **Restate both; do not link the site for them.** The
      site publishes from `main`, so a link out of this release would resolve
      to a later state and lose what 0.1.0 shipped. Link
      `blob/v0.1.0/docs/rfc-compliance.md` for the full detail — the tag is
      frozen even though the site is not.
    - Compliance at 0.1.0, read off the matrix at the tag rather than from
      memory, as *Total / Supported / Partial / Not Met / N-A*:
    
      | RFC | Total | Supported | Partial | Not Met | N/A |
      |---|---|---|---|---|---|
      | RFC 5424 | 40 | 33 | 0 | 0 | 7 |
      | RFC 5425 | 20 | 13 | 1 | 1 | 5 |
      | RFC 5426 | 17 | 8 | 0 | 0 | 9 |
      | RFC 6587 | 8 | 7 | 0 | 0 | 1 |
    
    - Platforms: Posix, Windows, FreeRTOS, FreeRTOS-Plus-TCP, lwIP (Raw API),
      OpenSSL, Mbed TLS, FatFs, FreeRTOS-Plus-FAT, C11 atomics.
    - *Known limitations* — #718, #719, #731, #732, #733, #734 (TLS contract
      divergences), #736 (oversize datagram above the default message cap),
      #755 (FreeRTOS `sysUpTime` early wrap) and #753 (fingerprint
      authorisation). Frame them as found by pre-release audit and disclosed on
      the affected platform pages. `CHANGELOG.md` is not published to the site,
      so bare `#nnn` autolinks on GitHub and needs no markdown link.
    - Write once to a file: `gh release create --notes-file` for the Release,
      same text into `CHANGELOG.md`.
    
  5. Seed .release-please-manifest.json to 0.1.0

  6. Seed version.txt to 0.1.0. release-type: simple manages this file and
    it does not exist yet; seeding it avoids release-please introducing it as a
    surprise in the first 0.2.0 pull request. It must agree with the manifest,
    which is what sbom.yml reads the version from

  7. Create the tag and GitHub Release as a draft first. release: published
    does not fire for a draft, so this is the inspection gate: check the tag,
    the notes and the source archives before anything is signed

  8. Publish the draft. That fires sbom.yml, which attaches four assets

  9. Verify per security/release-verification.md
    — that the bundles verify, not merely that the assets are present

  10. Unpark release-please: restore on: push: branches: [main] and rewrite the
    parked comment block, which describes its own removal

  11. Verify docs/ci.md:127 — "release-please runs on every push to main" is
    false while parked and becomes true here. Confirm rather than edit

Traps found during the pre-cut audit

  • Never git push --tags. Local clones may carry v1.0.0 and v1.1.0 from
    the pre-history-strip template era. The remote has no tags. Publishing those
    would put 1.1.0 ahead of 0.1.0 in semver and give release-please a false
    baseline to compute from. Deleted locally 2026-08-17; recorded here because a
    fresh clone of an old backup could reintroduce them.
  • "Re-run the job" means re-run the failed release-triggered run, not a fresh
    workflow_dispatch. The publish job is gated on
    github.event_name == 'release', and the cosign certificate identity binds to
    refs/tags/v<version>. A dispatched run executes from refs/heads/main, so
    publish is skipped — and were it to sign, the identity would not match the
    documented verify command.
  • No documentation snapshot is produced by a release. Nothing in ci.yml
    triggers on release; the site deploys on push to main only. That is S23.05: Versioned documentation publishing and version switcher #251,
    targeted at 0.2.0. Do not expect a versioned docs directory to appear.

Pre-cut documentation sweep

Every .md file and every source comment was swept for 0.1.0 / 1.0.0 on
2026-08-05, and re-verified against the tree on 2026-08-17. Source comments are
clean: there is no release-version reference anywhere in Core/ or Platform/.

Required — these state the release does not exist

  • .github/workflows/release-please.yml:3-13 — the parked comment block.
    Rewrite alongside step 10 above.
  • docs/release-process.md:35-37 — delete the "> Status: release-please is
    parked …" blockquote. Public docs page, and it contradicts its own checklist
    further down.

Consequential — stale once the manifest is seeded

  • docs/security/sbom.md:79 — drop the "Pre-release: 0.0.0" clause from the
    metadata.component.version row.

Settled

  • CLAUDE.md:295 — "0.1.0 is the first public release…" reads as future
    tense. Left as written: it defines what the milestone means rather than claiming
    the release has not happened, it is an internal process document, and rewriting
    it on release day is churn no reader benefits from. CLAUDE.md:274 (the backfill
    record) and CLAUDE.md:289 (the due dates) stay as written — historical or still
    true.
  • The cosign signing wording was carried as a judgement call to revisit at
    0.2.0. Neither phrase survives; the S23.22 audit rewrote both. Nothing to do.
  • README pre-0.1.0 warning banner — removed in 555349c (docs: S23.18 replace the reference designs with an integration path, and document the Make consumer #658), from both
    README.md and docs/README.md. No copy survives anywhere in the tree.

Deliberately out of scope

  • "beta stack" namingdocs/build-integration.md, the committed
    docs/generated/beta-stack-manifest.txt, and the anti-drift lane in ci.yml.
    Accurate while 0.1.0 is the beta. Renaming moves a generated file and a CI
    lane, so it belongs after the beta label stops applying.
  • Every 1.0.0 in the tree is unrelated to our 1.0.0 milestone — the PolyForm
    Noncommercial licence version, its SPDX identifier, or a test fixture
    SwVersion. Do not find-and-replace.

After the tag

  • Invite scrutiny of the TLS obligations. See the first comment below —
    this is the strongest action on this issue and the easiest to lose in the
    mechanics of tagging.

This issue is the release-day close-out; it should be the last to close on the
milestone.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    choreMaintenance, tooling, and infrastructure

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions