Repository navigation
docs(adr): ADR-0087's artifact window names its third disjunct — a first-release-of-a-major floor replays the major step ('converted-major-step', 58f5c90999) (#23038) - #23161
Conversation
…ajor-step replay The 2026-09-13 addendum stated the artifact-ingestion window as two disjuncts. Since 58f5c90 the door opens a third: a floor of M.0.0 at or above the runtime label replays every retired entry of the conversion step into M, default flips still refused by id first, under the verdict 'converted-major-step'. One dated amendment note under the window bullet records it with the M2 caveat and aligns the retiredAfter definition with the stable-release stamp rule of 719183f; the closing "within-line retirements" sentence is annotated, not rewritten; the status line gains its Amended entry. Claude-Session: https://claude.ai/code/session_012dGTuJen61ECNHXYXKChoC Co-authored-by: Claude <noreply@anthropic.com>
|
Blocker on this head (
The dev's label write was refused by its session's permission check before any request was sent. The seat does not route a refused write through another path, so the label waits on the maintainer: either their go-ahead for the seat to write it, or the label added by hand. Nothing else on this head is red. The contract review is held until this check is green, and then runs on the same head. Generated by Claude Code |
Contract reviewServed-tier: Inputs: card #23038 (body; comments 6124857034, 6138266255, 6138480565), PR #23161 (body, file list, comment 6138520160, no reviews), the net diff ① Derived judgmentsAccept-set and public surface: no change, and the PR says none — right. The diff touches Every clause of the new amendment note, judged against the code at
The annotation on the closing sentence, judged: " Prime Directive #13 — history stays, the current state is a dated note: right. The diff's only The ② Semver level
The ③ Boundary flags
What the maintainer must look at
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)PR #23161 · card #23038 · head 改了什么
为什么改
风险与代价(含回滚)
席位意见
你要做的
Generated by Claude Code |
Fixes #23038
Clause-②: no
One dated amendment note in
docs/adr/0087-metadata-protocol-upgrade-contract.md, in the shape4cc5bcd858(#20797) used for the #20390 note. Tier H (docs/adr/**), so this PR stays a draft for the maintainer's review. Nothing here publishes:skip-changeset.What changed
All three edits are in the one ADR file. No recorded text is rewritten.
**Amended**entry (2026-10-13). It names the third disjunct, the producer58f5c90999and the verdict'converted-major-step', and points at the new note.4cc5bcd858added a status-line entry for its note, so this one does too (H3).E.retiredAfter, OR (the floor isM.0.0ANDE.toMajoris M). A first-release floor at or above the runtime label replays every retired entry of the conversion step into M. Default flips are still refused by id first. The verdict is'converted-major-step'. Symbol anchor:artifact-forward-conversion.ts#idsTheFloorPostdates.M.0.0. The per-entry half therefore read a^18artifact built before a prerelease retirement as'authored-current'.#DEFAULT_FLIPS_NOT_REPLAYED_HERE.retiredAfterwith spec(conversions): under a pre-mode label (18.0.0-next.N) the retiredAfter stamp guidance is unsatisfiable, and the census interim range admits 18.0.0, which its own PUBLISHED rule rejects after GA #23042's landed rule (H2, below).6124857034directed. A datedAnnotated (2026-10-13)blockquote follows it. It says the window also serves a prerelease-major floor (^18on a runtime labelled from 17.7.0 through 18.0.0; from 18.0.1 on, the label half replays the whole chain for it). It also says the handshake still answers first, because the protocol constant moves to M when M's prerelease opens.Diff: 1 file, +42 / −1 (the −1 is the status line, which is extended, not reworded). The ADR goes from 1218 to 1259 lines.
Checked before editing: the premise holds (H1), at
02bec6ca8origin/main. The ADR has thefloor-at-or-below-E.retiredAfterdisjunct once, in the 2026-09-30 note, and "within-line retirements" once, in the closing sentence. The module hasfirstReleaseOfMajorinidsTheFloorPostdatesand'converted-major-step'in the verdict union, the verdict assignment and the module docblock.idsTheFloorPostdatesreadsDEFAULT_FLIPS_NOT_REPLAYED_HEREfirst. It then opens a retired entry in one of two ways:retiredAfteris at or above the floor (the per-entry half), orfloorisM.0.0andconversion.toMajor === floor[0](the major-step half). AnymajorStepentry gives the verdict'converted-major-step'.PROTOCOL_VERSIONis'18.0.0'whilepackages/spec/package.jsonis17.7.0. This is the label/protocol split the annotation's handshake sentence relies on.H2: does #23042's landed rule leave ADR-0087's
retiredAftersentence true?My reading differs from the dispatch's. The dispatch read "narrowed, not contradicted". I read that the sentence no longer holds as written under pre mode, so the note carries one aligning clause.
retiredAfteras "the last published@objectstack/specwhose authoring surface still accepted the old shape".719183f50(PR test(spec): under a prerelease package label the retired-after census refuses the release triple, and the retiredAfter TSDoc names the newest published stable release #23130),RetiredConversionState.retiredAfter's TSDoc reads "… as a stablex.y.z". Under a prerelease label it is "the newest published stable release … never the label (not a stablex.y.z) and neverx.y.z". The census test's docblock says "the census holds stable releases only".npm view @objectstack/spec versionslists 9 of them:16.0.0-rc.0–rc.1and17.0.0-rc.0–rc.6..changeset/pre.jsonis{"mode":"pre","tag":"next"}, so18.0.0-next.Ntarballs are next.18.0.0-next.Npublish. The ADR's sentence, read literally, then names that prerelease tarball. The landed rule names17.7.0. Those are two different values, and the prerelease one does not even type-check against${number}.${number}.${number}.retiredAfterthe note above defines is a stablex.y.z: under a prerelease label (Changesets pre mode) it is the newest published stable release, never a prerelease tarball (spec(conversions): under a pre-mode label (18.0.0-next.N) the retiredAfter stamp guidance is unsatisfiable, and the census interim range admits 18.0.0, which its own PUBLISHED rule rejects after GA #23042, landed as719183f50, PR test(spec): under a prerelease package label the retired-after census refuses the release triple, and the retiredAfter TSDoc names the newest published stable release #23130)." It is in the same note. The 2026-09-30 text itself is untouched.H4: anchors
scripts/adr-anchors/*.jsonmaps code files to ADR ids. It cites no ADR line ranges, so the insertion moves no anchor.pnpm check:adr-anchorsexited 0. The note uses nopath:NNNline anchors. Its twopath#Symbolanchors resolve undercheck-adr-symbol-anchors, which reported 2321 anchors resolving and 0 line anchors.Gates, at head
82ffd67f4fnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwas re-derived with no paths after the edit. It took the change set from git: 1 path against merge base02bec6ca8. It derived the same 23 commands the dispatch named. Each command ran on its own in the foreground, with its log redirected and its exit read before any pipe. All 23 exited 0.--ranprinted: "Run reconciliation — 23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN."check-adr-0087-registration --base origin/main: "this PR adds no declared-breaking changeset". Its--self-test: 548 assertions.check-adr-links: "730 relative link destination(s) under docs/adr/ resolve". Its--self-testpassed.check-adr-symbol-anchors: "2321 anchors across 142 records resolve … 0 line anchors survive". Its--self-testpassed.check-ci-filter-parity: OK.check-closing-keyword-parity: OK. Its--self-test: 40 assertions.check-comment-mask-corpus: 8935 files, 0 disagree.pnpm --filter @objectstack/lint run check:doc-formula-expressions. The first run exited 3 (PREREQUISITE NOT MET:@objectstack/formulaunbuilt in the fresh worktree), which measured nothing. I then ranturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (4/4 tasks, VERDICT command-exit 0). The re-run exited 0, with self-test 61 cases and 22 + 9 + 15 examples judged clean.pnpm check:gates, all exit 0:adr-anchors: OK, 68 anchored files.changeset-gate-self-tests.cross-package-test-inputs: OK.doc-authoring.driver-memory-census: OK.future-spec-major: "no@objectstack/speccitation names a major above 17".gitlink-declared: OK.nul-bytes: OK, 11174 files.pm-governed-merges: self-test 500 assertions, live certified.pm-prior-rulings.refd-timer-probe: OK.watch-hint-literal.grep -naPover the C0 range and DEL): no hits.Acceptance notes
artifact-forward-conversion.tsstill says "within-line retirements (17.1 → 17.2) are exactly the case that created this module" in its full-x.y.zparagraph. That sentence is about which comparison the module uses, so it remains true, and code is outside this card's surface. I noted it and did not edit it.维护者速读(草稿)
改了什么
M.0.0且不低于运行时标签时,重放第 M 步的全部退役条目(默认翻转仍按 id 先拒),verdict 为'converted-major-step',出处是58f5c90999。注里还写了 M2 告诫。为什么改
58f5c90999起已按三个析取运行,ADR 的文字仍只写两个。读 ADR 判断「构件的退役条目何时重放」的人和 agent 会读到过窄的规则。retiredAfter只取稳定版。ADR 原句没有说「稳定」,在 pre 模式下字面可读成预发布 tarball。注里加了一个分句对齐,原句未动。风险与代价(含回滚)
retiredAfter的那一分句是本次实测后加的(派发令授权「不成立才加」)。如果你认为原句本就只指稳定版,可在评审中要求删去这一句。席位意见
你要做的
retiredAfter对齐分句,或调整「within-line」注释的措辞,请在评审中写明。Generated by Claude Code