Skip to content

chore(release): prepare 0.17.0 - #83

Merged
dweekly merged 2 commits into
mainfrom
release/0.17.0
Sep 4, 2026
Merged

chore(release): prepare 0.17.0#83
dweekly merged 2 commits into
mainfrom
release/0.17.0

Conversation

@dweekly

@dweekly dweekly commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Plain English

This gets the repository ready to tag 0.17.0. No library behavior changes here: it bumps the version constant, turns the running list of per-pull-request notes into release notes a consumer can actually read, and fixes several statements that were wrong and would have shipped as documentation.

The release itself is additive. swift package diagnose-api-breaking-changes v0.16.0 reports no breaking changes, so consumers upgrade with a version bump. Two runtime behaviors do change for an unmodified caller, and both are now stated at the top of the notes: ASN lookups use the embedded database by default instead of DNS, and strict IPv4 validation rejects malformed dotted strings that used to be classified from a prefix.

Corrections, and how each was checked

Four claims were wrong. Each was verified by measurement or by reading the code, not by trusting the commit that introduced it.

  • The embedded database's memory cost. Two source comments contradicted each other, one saying about 6 MB and the other about 50. Neither is the number a caller wants. Measured against SwiftIP2ASN 0.5.1 by loading the database repeatedly in a release build: one copy is about 15 MB, of which 9.4 MB is range arrays and roughly 6 MB is ASN-name strings. The first load takes process footprint to about 51 MB because the decoder allocates a scratch buffer eight times the compressed size and the allocator keeps those pages rather than returning them. That is now in BENCHMARKS.md with the numbers, the reason, and a note that reducing it further means changing the on-disk format upstream rather than anything here.
  • The default resolver strategy. The doc comment still said the default was .dns, two lines above the bullet marking .hybrid(.embedded) as the default.
  • A dependency pin that does not exist. The note said taking SwiftIP2ASN 0.5.0 "pins our own CI to what they get". Package.resolved is gitignored and SwiftPM ignores a library's resolution when it is consumed, so nothing is pinned. The requirement from: "0.4.1" actually resolves to 0.5.1 today, which is what this release is tested against.
  • The cold-resolution figures. The notes claimed 0.215s dropping to 0.094s, inherited rather than reproduced. Re-measured in release: 0.187s on .dns against 0.059s on .hybrid(.embedded), both resolving 10/10. Worth knowing for anyone who repeats this: in a debug build the ordering inverts, because decompressing and parsing the database is roughly eight times slower unoptimized. BENCHMARKS.md now says to compare in release only.

Roadmap and design doc

Two queue items shipped in this cycle and are removed: the cache and network-transition lifecycle work, and the STUN redundancy fix. What did not ship is sharing a reverse-DNS cache between tracer instances, which stays, now stating the reason it is blocked: eviction is per-instance, so one tracer's network change would clear a sibling's entries, and sharing needs eviction scoped by network identity first.

The lifecycle design document described the APIs as proposals. They exist, so it now describes them in the present tense, records which of its open questions the implementation answered, and is cited from README rather than depending on a roadmap entry that will eventually be removed.

Verification

126 tests pass with live network enabled. swift format lint --strict is clean, DocC builds with warnings as errors, the release binary and its JSON output both report 0.17.0, and the API digester against v0.16.0 reports no breaking changes.

After this merges

Tag the merge commit v0.17.0 as an annotated tag, which the release workflow requires, then gh release create from the consolidated notes.

🤖 Generated with Claude Code

https://claude.ai/code/session_017sTdURjHTGgQ5j5vY6uhTm

dweekly and others added 2 commits September 3, 2026 19:22
Bump the version constant, consolidate the per-PR Unreleased entries into a
release section organized by user-visible value, and correct four claims that
would otherwise have shipped:

- The embedded database's memory cost. Two source comments disagreed with each
  other, one saying ~6 MB and one ~50 MB. Measured against SwiftIP2ASN 0.5.1: a
  copy is ~15 MB, and the first load takes process footprint to ~51 MB because
  the decoder's 8x scratch buffer is retained by the allocator rather than
  returned. Recorded in BENCHMARKS.md with the reproduction and with where a
  further reduction would have to happen, which is the upstream format.
- The default ASN strategy. The doc comment still said the default was .dns two
  lines above the bullet marking .hybrid(.embedded) as the default.
- The dependency note claimed taking SwiftIP2ASN 0.5.0 pinned our CI. It pins
  nothing: Package.resolved is gitignored, and consumers resolve independently.
  We test against 0.5.1, which is what `from: "0.4.1"` actually resolves to.
- The cold-resolution figures, which were inherited rather than reproduced.
  Re-measured in release: 0.187s on .dns against 0.059s on .hybrid(.embedded).
  The debug build inverts that ordering, so BENCHMARKS.md now says to compare
  in release only.

Drop the two roadmap items this release completed, leaving the reverse-DNS
cache sharing that did not ship and stating the eviction-scoping problem that
blocks it. Rewrite the lifecycle design doc to describe what exists rather than
what was proposed, and cite it from README so it does not depend on a roadmap
entry for its home.

Verified on this branch: 126 tests pass with live network, swift-format lint
clean, DocC builds warning-free, `diagnose-api-breaking-changes v0.16.0`
reports no breaking changes, and the release binary reports 0.17.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017sTdURjHTGgQ5j5vY6uhTm
codex-review caught the release notes and the lifecycle design doc asserting
that PublicIPSource lets a caller tell seeded addresses apart by trust level.
It does not: seedPublicIP takes the parameter and discards it, caching every
accepted address identically, and nothing reads it back.

State that plainly on the enum, on the parameter, and in the release notes, and
record the real decision in the design doc's open questions: either persist the
source and act on the difference, or drop a required argument that does nothing.
Resolving that is API design and does not belong in a release-prep change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017sTdURjHTGgQ5j5vY6uhTm
@dweekly
dweekly merged commit 28432f1 into main Sep 4, 2026
7 checks passed
@dweekly
dweekly deleted the release/0.17.0 branch September 4, 2026 02:33
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