Skip to content

Release the _meta revision fix as 0.2.0 - #8

Merged
HackTuah merged 1 commit into
mainfrom
slice/001b-release-0-2-0
Sep 7, 2026
Merged

Release the _meta revision fix as 0.2.0#8
HackTuah merged 1 commit into
mainfrom
slice/001b-release-0-2-0

Conversation

@HackTuah

@HackTuah HackTuah commented Sep 7, 2026

Copy link
Copy Markdown
Member

Owner decision: the _meta revision fix that merged as 0.1.2 releases as 0.2.0.

Why

For a client declaring 2025-11-25, a method that was refused now answers (ping), and results on that path have lost two fieldsresultType and _meta serverInfo. A 0.1.0 consumer could have depended on either. For a published package the wire JSON is the API, so this is a minor bump. The field removal is the breaking-shaped half and carries the decision on its own.

One of the two stated grounds was wrong and is corrected rather than quietly reworded. The rationale said "a method that answered now refuses" — true of no method in this release. A reviewer caught it by enumerating every method on this tree and on 0.1.0's:

ping         0.1.0: REFUSED -32601      0.2.0: answered
every other method: unchanged status on both

That sentence reached the changelog unchecked from the decision that used it. Correcting it strengthens the case for 0.2.0 rather than weakening it.

A standing rule, from a lane finding

The README recommended {:beam_mcp, "~> 0.1"} — a requirement spanning the very break the version bump exists to signal. Nothing was broken for a new user; the defect is that a consumer who copied it at 0.1.0 is carried across the break by a routine mix deps.update with no signal. It survived a deliberate version sweep because the stale string was 0.1, not the 0.1.2 that changed.

So CONVENTIONS.md gains: the README states what the package does today, and every behavioural claim in it is pinned by a test that runs. test/beam_mcp/readme_claims_test.exs discharges it — each test quotes the README sentence it pins and asserts that sentence is still present, so a claim that moves without its test fails, and a test guarding a deleted claim fails too rather than reading as coverage while guarding nothing.

Three claims previously had nothing holding them, including that every method is served bare with tools/call reaching dispatch — a security property that rested on prose.

Verification

./tools/gate.sh    format / compile / test / credo  pass
                   reuse  pass (20 commentable files)
                   licence files  pass
                   Gate OK.  exit=0
mix test           47 tests, 0 failures

Scored by mutation: reverting the README dependency fails the claim quote (8 tests, 1 failure); inserting a session guard fails the two behavioural tests (8 tests, 2 failures). Mutant B's source check reported old remaining: 1 because the replacement embeds the original line — that count carried no information, and the effect is what proved it applied.

Base

PR #7 merged by rebase while round 7 was in flight, so main carries a rewritten commit and the local one was not its ancestor. Trees compared identical (a866ad8d both, empty diff) before resetting onto main.

Review

Rounds 7 and 8, two independent lanes on checkouts of the index; both approved tree 072cf981. The committed tree is that tree plus the two round-8 lane reports and nothing else — verifiable with git diff 072cf981 HEAD^{tree}.

Filed, not folded in

Six non-blocking items both lanes raised, including whether the README should recommend ~> 0.2.0 rather than ~> 0.2: ~> 0.2 admits 0.3.0 and so spans the next break the way ~> 0.1 spanned this one. ~> 0.MINOR is a common Hex idiom, so that is a maintainer's call and is not made here.

Owner decision. The fix on main is numbered 0.1.2; this makes it 0.2.0.

For a client declaring 2025-11-25 a method that was refused now answers
(ping), and results on that path have lost two fields -- resultType and
_meta serverInfo. A 0.1.0 consumer could have depended on either. For a
published package the wire JSON is the API, so that is a minor bump.

The field removal is the breaking-shaped half and carries the decision on
its own. An earlier statement of the rationale had the ping direction
backwards -- it said a method that answered now refuses, which is true of
no method in this release. A reviewer caught it by enumerating every
method on this tree and on 0.1.0's rather than by reading the rationale:

    ping         0.1.0: REFUSED -32601      0.2.0: answered
    every other method: unchanged status on both

That sentence was one of the two grounds given for the number and reached
the changelog unchecked. The changelog now names the error rather than
quietly rewording it.

Also in this release, because a lane found the README recommending a
requirement that spans the break the version exists to signal:

CONVENTIONS.md gains a standing rule -- the README states what the package
does today, and every behavioural claim in it is pinned by a test that
runs. test/beam_mcp/readme_claims_test.exs discharges it. Each test quotes
the README sentence it pins and asserts that sentence is still present, so
a claim that moves without its test fails, and a test guarding a deleted
claim fails too rather than reading as coverage. Three claims previously
had nothing holding them, including that every method is served bare with
tools/call reaching dispatch -- a security property that rested on prose.

Scored by mutation. Reverting the README dependency fails the claim quote;
inserting a session guard fails the two behavioural tests:

    MUTANT A  8 tests, 1 failure   REAL_EXIT=2
    MUTANT B  8 tests, 2 failures  REAL_EXIT=2

Mutant B's source check reported old-remaining 1 because the replacement
clause embeds the original line, so that count carried no information;
what proved it applied was the effect. Assert the effect, not only the
match count.

    ./tools/gate.sh    format / compile / test / credo  pass
                       reuse  pass (20 commentable files)
                       licence files  pass
    Gate OK.  exit=0
    mix test           47 tests, 0 failures

Base re-derived rather than assumed: PR #7 merged by rebase, so main
carries a rewritten commit and the local one was not its ancestor. Trees
compared identical (a866ad8 both, empty diff) before resetting onto main.

Reviewed on a checkout of the index by two independent lanes over rounds 7
and 8; both approved tree 072cf981. The committed tree is that tree plus
the two round-8 lane reports and nothing else.

Six non-blocking items both lanes raised are filed rather than folded in,
including whether the README should recommend ~> 0.2.0 rather than ~> 0.2
-- ~> 0.2 admits 0.3.0 and so spans the next break the way ~> 0.1 spanned
this one. That is a maintainer's call and is not made here.

Signed-off-by: Ayla Croft <aylacroft@proton.me>
@HackTuah
HackTuah merged commit bee3d26 into main Sep 7, 2026
4 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