Repository navigation
feat(adr-0087): retire a deleted published package whole (PACKAGE#*, D9 amendment) - #26766
Conversation
…ge>#*` ADR-0087 D9 gains a whole-package operand for `runtime-export-retired`, per the ruling on PR #26365 (comment 6439038287, letter A). A published package deleted at HEAD has no entry to read an absence from, so the operand is the package itself: predicate 1 proves it was a published workspace member at the merge base and is absent at HEAD (no package.json, no workspace glob naming its directory, not in the changesets fixed group); predicate 2 asks the package for a metadata surface or a metadata-surface importer; predicate 3 reads its one FROM line by package name. The gate gains that predicate and a 50-assertion WP battery. Claude-Session: https://claude.ai/code/session_01JQwxbX6swE1AuYRHTZsPqo Co-authored-by: Claude <noreply@anthropic.com>
|
Seat This is Tier H ( Two wording points beyond the ruling's literal text are flagged in the PR body's Acceptance notes for that review (predicate 2's package reading; a deleted package's exports take no FROM line of their own). Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #26220 body and all 14 comments (the claim 6444671327, the dispatch order 6444498687, the ruling pointer 6439050525, the four os-dev reports); PR #26766 body, file list, its one comment 6445680015 and its one review; the net diff against Gate verdicts on the head (the check-runs ARE the verdicts): 46 runs, all ① Derived judgmentsEach accept-set and public-surface change the diff implies, named right or wrong:
② Semver level
③ Boundary flagsEvery dev flag and every
Must-fix, before a PASS on a new head:
Should-fix in the same push: ③-c and ③-d wording. Implemented-by: VERDICT: FAIL Generated by Claude Code |
…, not only an import Contract review patch round. Predicate 2 for `<package>#*` returns to D9's reading, "no metadata surface references it in code" with comment spans masked: `packageReference` refuses on any non-comment occurrence of the package name outside its own files, an import specifier being the case reported as `import`. New WP-R14 (a string value in an object definition) and WP-U5; WP floor 50 -> 55. The ADR's two closed-vocabulary blocks (2026-08-13 and 2026-10-12 addenda) gain the `<package>#*` marker line and the "three operand kinds" wording, and the D9 note's predicate 2, "single line" and "moved, its directory renamed" wording follow the review. Claude-Session: https://claude.ai/code/session_01JQwxbX6swE1AuYRHTZsPqo Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Re-review of the head that answered the FAIL record on Gate verdicts on the head: 41 check-runs; 26 ① Derived judgmentsThe two must-fix items, checked exactly.
The two should-fix wording points.
The delta in its own right.
PASS-side judgments from the first record, re-confirmed on the new head. The delta touches only predicate 2's whole-package reader, its refusal text, the WP battery and pin, and the ADR prose named above; ② Semver levelUnchanged and correct: ③ Boundary flags
Should-fix, none blocking: ①-1's lookbehind residual (one character plus a U-case); the PR body refresh in ③-(j). Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(席位终稿)
席位意见:契约复核第一轮 FAIL(谓词 2 被收窄为"只看导入"、封闭词表未补),两项必改均在 席位核对ACCEPT · seat
Generated by Claude Code |
Requested by Warren · project thread
Fixes #26220
Clause-②: no
Metadata-protocol: none
维护者速读
runtime-export-retired的操作数写成包名#*;门禁check-adr-0087-registration加对应谓词,自测新增 WP 电池 55 条。@object-ui/plugin-aiand its three node types #26365 评论 6439038287 的裁决 A(维护者「同意」)。被删的包在 HEAD 没有入口可读,@object-ui/plugin-ai的下线(refactor(ui)!: retire@object-ui/plugin-aiand its three node types #26365)在这个门禁上会一直红。package.json、pnpm-workspace.yaml不再列它的目录、不在 changesets 的 fixed 组。其他判定不变,原有 627 条自测照样全绿。回滚即 revert 本 PR。docs/adr/0087-metadata-protocol-upgrade-contract.md里 D9 下面的第二条 2026-10-27 修订说明;scripts/check-adr-0087-registration.mjs的verifyWholePackageRetired和谓词 2 的整包分支(packageReference)。node scripts/check-adr-0087-registration.mjs --self-test,预期以 0 退出并打印682 assertions。CONTRACT_REVIEW_TIER)PASS 和席位 ACCEPT,在那之前不需要你操作。What changes
ADR-0087 D9, amended (Tier H). A second dated note under D9's unmappable-entry paragraph, plus a Status-line entry, records the ruling on PR #26365 (comment
6439038287, letter A, the maintainer's 「同意」 2026-10-27T10:07Z). A published package deleted at HEAD is retired whole with a third operand kind,PACKAGE#*:retired-from-entry) is proven about the package. At the merge base it must be a workspace member, notprivate, and its published entry must map as D9 already requires. At HEAD it must be absent from the workspace in all of the ruling's three senses: nopackage.json(the base manifest is gone, and no workspace manifest carries the name, so a package that moved or was renamed is not deleted), nopnpm-workspace.yamlglob naming its directory literally, and nofixedgroup in.changeset/config.jsonlisting it. A missing or unreadable config is refused, never read as an empty group.no-metadata-surface) asks the package what it asks an export, at the merge base: none of the package's files is a metadata surface, and no metadata surface outside it names it in code (comment spans masked): an import specifier, by its root or a subpath, or any other occurrence of the package name, a string value included.from-operands-named): the FROM → TO block names the package on a single line, not one per export, by its package name. Its exports take no line of their own.An export or member operand on a deleted package is still refused at predicate 1, and the refusal now names the
PACKAGE#*spelling. The closed-vocabulary blocks of the 2026-08-13 and 2026-10-12 addenda list the third marker line, and the 2026-10-12 addendum now reads "three operand kinds".scripts/check-adr-0087-registration.mjs.parseExportOperandacceptsPACKAGE#*.verifyWholePackageRetiredsits besidesourceEntryAtand holds predicate 1's package proof. It names every HEAD condition that fails, not only the first.packageReferenceand a whole-package branch hold predicate 2. It refuses on the first comment-masked occurrence of the package name outside the package's own files, and reports an import specifier as IMPORTS.#*package's name as that operand.Why
The ruling closes the last open question on #26220. Without the clause, a whole-package retirement could only land red. Its alternatives were
registered, which would name a conversion that never happens, andnot-required (unpublished), which readsprivate: trueat HEAD, a field a deleted package cannot carry.Tests
--self-testat994c3279: exit 0,682 assertions over real temp git repos(627 at basedc9d1ff8). The new batteryWP (#26220)has 55 assertions, and the roster floor goes from 57 to 58 batteries. Each red differs from WP-G1 in one respect.WP cases
@object-ui/plugin-aiand its three node types #26365 shape. G1b: the verdict names#*and the manifest. G2: the one line written as an arrow removal. G3: a metadata surface that names the package only in comments.private: trueat base. R3: not a workspace member at base. R4: not deleted. R5: moved to another directory under the same name. R6:pnpm-workspace.yamlstill names the directory. R7: no changesets config at HEAD. R8: no mappable published entry at base.*.zod.ts. R10: a metadata surface outside it imports it.#*.packageReferencereads a subpath import, skips the package's own files, does not match a name that only shares the prefix (plugin-xy), and reports a string-value mention with its line while skipping a comment.First consumer, measured with this branch's gate against
origin/maindc9d1ff8:@object-ui/plugin-aiand its three node types #26365's headbde1e722, unchanged: exit 1. Each of its three export operands is refused at HEAD, and each refusal now names@object-ui/plugin-ai#*.runtime-export-retired @object-ui/plugin-ai#*, and its three per-export FROM lines become one- FROM `@object-ui/plugin-ai` TO …line): exit 0,verified: @object-ui/plugin-ai#* (package, ui/packages/plugin-ai/package.json).So #26365 needs exactly those two changeset edits. They belong to that PR and are not made here.
Acceptance notes
fixedis read, as the ruling names it. A glob entry names no package, andlinked/ignoreare not read.@object-ui/plugin-aiand its three node types #26365's before/after pair above is the end-to-end witness.private, anddocs/adr/**is not shipped. The PR carriesskip-changeset.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat994c3279(merge basedc9d1ff8, 2 paths): 44 commands derived, 44 run, all exit 0. Each ran with stdin from/dev/null, and each exit was captured before any pipe.check:doc-formula-expressionsran afterturbo run buildof@objectstack/formulaand@objectstack/lintunder the verify lock.--ranreconciliation: 44 derived, 44 run, 0 NOT-MEASURED, 0 UNRUN. No test file names the edited script (git grepover*.test.*/*.spec.*: 0 hits).Tier H (
docs/adr/**). The director seat's contract review atCONTRACT_REVIEW_TIERis PASS on994c3279(comment 6458009682), after a FAIL on75285daf(6457699551). Landing waits for the seat's ACCEPT.Human Minimum
packages/specholds no runtime logic. (Nopackages/specchange.)pnpm lintpasses. (No formatter ran; lint is CI's run.)main, one pull request.skip-changeset.)packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code