Skip to content

Commit cec5464

Browse files
dmealingclaude
andcommitted
docs(changelog): the two changes above had no entry
A change with no CHANGELOG entry is invisible to everyone who reads the release rather than the log. Both of this session's product-visible changes get one: - the 1.0 upgrade path's destructive instruction and the derived gate that keeps a retirement table honest against `expected-registry.json` - the conformance workflow's nightly schedule, with the measurement that argues for it — a nightly `local-ci` reporting `java-slow: success` while two defects its hosted twin would find sat live on `main` The two Java test fixes those defects produced are named by SHA rather than implied, and the entry says why they carry no entry of their own: they are test-only and ship in no package. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NTcEKXTQMYt84fAjuw5A2M
1 parent 10ad358 commit cec5464

1 file changed

Lines changed: 60 additions & 0 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,66 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
77

88
## [Unreleased]
99

10+
### Fixed — the 1.0 upgrade path told adopters to destroy records 1.0 keeps
11+
12+
`verified-by-retirement.md` §2 says, in bold, *"Not 'change its status' — **delete the
13+
node**"*, for every `@status: abandoned` and `@status: superseded` requirement. That was
14+
right for `0.24.0`: no status could hold the entry, so the record had nowhere to go and
15+
version control was the honest answer.
16+
17+
**`0.24.2` reversed it, and the reversal shipped somewhere else.** `@status: retired` became
18+
the home for exactly those nodes, `@supersededBy` was re-registered as a reference the loader
19+
resolves, and `meta upgrade --apply` performs the whole rewrite in one determinate pass — but
20+
in a separate guide, while the original kept its instruction. So `0.x-to-1.0.md`, which is
21+
what a `0.23.x` adopter actually reads, said in §8B *"Retiring a capability is now DELETION of
22+
its requirement"* and mentioned the restoration only in a parenthetical at the end of §9. Read
23+
top to bottom, the entries are gone before the reader reaches the sentence that would have
24+
saved them. **At least one adopting estate followed it as written and lost ledger entries that
25+
the release it was upgrading TO would have kept** — the deletion is irreversible, which is why
26+
this is not a documentation nit.
27+
28+
Both places are corrected in the direction of the reader's actual TARGET rather than the
29+
release each section is named for: §8B leads with "do NOT delete" and names `meta upgrade
30+
--apply`; the standalone guide carries a supersession banner above the fold and again at §2;
31+
its retirement table gains a **"still true at 1.0?"** column, because `@supersededBy`'s row was
32+
simply false; and §9's parenthetical now says what the additive restore gives BACK, not only
33+
that it breaks nothing.
34+
35+
**The gate is derived, not a list of guides to watch** (`scripts/check-migration-guides-vs-registry.mjs`,
36+
wired into the `gates` lane): a retirement table row may not claim a name fails to load while
37+
`expected-registry.json` — the byte-gated manifest all five ports match, i.e. the authority on
38+
what is registered *today* — registers it. Proven in both directions before wiring: the shipped
39+
`@supersededBy` row is in the test as the case that must fire, and the first draft's false
40+
positives (prose whose `ERR_UNKNOWN_ATTR` belonged to a different attribute two clauses
41+
earlier) are in there as cases that must not. Its one blind spot is stated in the header rather
42+
than papered over — the manifest is flat on the attribute axis, so a claim scoped to a single
43+
type (*"a legacy `@unique` on `identity.secondary`"*) is out of reach. It catches the
44+
whole-name case, which is the one that came back.
45+
46+
### Changed — the cross-port conformance workflow runs nightly, not only at a cut
47+
48+
`conformance.yml` ran on release tags and `workflow_dispatch` only. The stated reason for that
49+
— push-to-`main` coverage moved to the self-hosted `local-ci` runner — is sound on SCOPE:
50+
`local-ci`'s `java-slow` lane runs the same full reactor (`gate_java_reactor`, `mvn clean
51+
install`), so "the reactor is not run between releases" was never true.
52+
53+
**The gap is ENVIRONMENTAL, and it is measured.** Two Java test defects (fixed in `1c24b8f9d`
54+
and `cd0158073` — test-only, so they carry no entry of their own here: they ship in no
55+
package) were both found by the `v1.0.0-rc.5` tag's run of this workflow. The nightly `local-ci` run
56+
that preceded both fixes reported `java-slow: success` with both defects live on `main`. One
57+
asserts on an NPE message HotSpot's fast-throw is entitled to stop producing once the path is
58+
hot; the other is two test classes sharing files with nothing declaring their surefire order.
59+
JIT heat and filesystem ordering are precisely the defect classes a single environment cannot
60+
see on its own — and the two runs differ in exactly that: hosted `ubuntu-latest` with jacoco ON
61+
here, self-hosted with `-Djacoco.skip=true` there. So the second environment existed, and a
62+
tag-only trigger meant it looked only at a cut, which is the most expensive moment to find out.
63+
64+
Nightly at 04:41 UTC, offset from `local-ci`'s 08:17 so the two full-reactor runs do not
65+
overlap. Standard runners are free for a public repo; the second look costs wall-clock and
66+
nothing else. Both live statements of the old trigger set — `AGENTS.md`'s CI paragraph and
67+
`fixtures/validation-conformance/README.md` — are corrected in the same change, so the workflow
68+
and its documentation cannot disagree about when it runs.
69+
1070
### Fixed — `@sortableDefaultOrder` names two doors and only one was open, in every port
1171

1272
`0.25.0` finished this attribute's read side at the HTTP boundary: `?sort=field` with no

0 commit comments

Comments
 (0)