Repository navigation
feat(spec)!: retire kernel/package-upgrade.zod.ts whole — the upgrade plan, diff, snapshot and rollback model nothing implemented (ADR-0049) - #25757
Conversation
Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
…for the retired defs Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
…ngeset Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
… demotion count follow the retirement Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
… page Claude-Session: https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC Co-authored-by: Claude <noreply@anthropic.com>
…tire-package-upgrade
📓 Docs Drift CheckThis PR changes 1 package(s): 22 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 10 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 144 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 9fa3f3f5a4b0ef05276d132f7501847a71b274c2 && git checkout 9fa3f3f5a4b0ef05276d132f7501847a71b274c2
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5874d25302cbb80db675eddf1b69198073fbe2a9 3e7b204be77b8f04ff227a829a70af1d064f6c0c && git checkout -B drift-repro 5874d25302cbb80db675eddf1b69198073fbe2a9 && git merge --no-ff 3e7b204be77b8f04ff227a829a70af1d064f6c0c
node scripts/docs-audit/affected-docs.mjs --json 5874d25302cbb80db675eddf1b69198073fbe2a9
|
席位核对ACCEPT · #25608 ·
|
Contract reviewServed-tier: Rendered 2026-10-25T09:25Z on PR #25757 at head ① Derived judgmentsR1 — the removal takes what the ruling names, plus what it forced, and nothing else. Right. R2 — R3 — the ADR-0087 carrier is the ledger record, not a D2 conversion or a tombstone. Right. None of the ten defs is a stack collection or a metadata type; the skill's §3 says a surface with no authored source to rewrite takes the D3 R4 — the generated artifacts move the way a whole-def retirement must. Right. The skill's visibility table says a whole-def removal MUST move all four ratchets; it did, and nothing was added: R5 — producers are zero, re-measured here beside a lit control. Right, with one stale citation corrected. In this repository at the head, outside R6 — the new pin is inside its declared radius. Right. R7 — the hand-written prose made false by the diff was corrected truthfully. Right. ② Semver level
③ Boundary flagsDev report
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #25608
Clause-②: no (narrowing)
Metadata-protocol: narrowed
Ruling-ref: 6259332195 (ruling A on #24443, item 3); triage first grade 6382810541
Retires
packages/spec/src/kernel/package-upgrade.zod.tswhole — the package upgrade plan, metadata diff, impact level, pre-upgrade snapshot, upgrade and rollback request/response pairs and the phase vocabulary — together with the fourIPackageServicemembers that returned them (planUpgrade,upgrade,rollback,getSnapshot) and their three input interfaces, and theplanmember ofPackageUpgradeResponse.data. ADR-0049 enforce-or-remove, route 3 (whole-def removal). Nothing ever implemented, served or read any of it.The two governed sentences (ADR-0126 about
:321, and the ADR-0138 D5 sentence ruling A6386464761orders) ride their own draft PR, #25716, which merges after this one.Ruling executed (quoted, not re-ruled)
Ruling
6259332195on #24443, letter A, maintainer 「其他同意」, item 3: "Retired:packages/spec/src/kernel/package-upgrade.zod.ts(plan, diff, conflict, snapshot, rollback; zero runtime consumers), with its ADR-0087 conversion." Triage6382810541: done directly in 18.x with no retirement stage.Premise re-measured (every zero beside a lit control)
planUpgrade+ the module specifierpackages/spec, CHANGELOGs excluded47af3dde42references/kernel/meta.json,content/docs/upgrading.mdx, one ADR-0126 sentencepackages/specmaina3c0da9@objectstack/spec: 2123 files.objectui-sha2958f17e9c@objectstack/spec: 2131 filesmaina4b3560@objectstack/spec: 293 filesIPackageServiceThe card's inventory held, with two additions it did not list:
src/system/compliance-families-retirement.test.tsusedMetadataChangeTypeas its "live near-namesake" must-survive control (its only reader was the retired module itself; the control is nowBreakingChange), and the contract lost four members and three input interfaces, not two —rollbackandgetSnapshotreturned the retiredRollbackPackageResponse/UpgradeSnapshotas well.Why no D2 conversion and no tombstone
None of the ten shapes is a stack collection member or a metadata type, so there is no authored document a D2 conversion could rewrite and no carrier key a
retiredKey()tombstone could sit on. The ruling's "ADR-0087 conversion" is therefore the ledger record, exactly as for the export-job and change-management whole-family retirements: tenRETIRED_DEFS_BY_MAJOR[18]entries (which the manifest-deletion gate reads), one D3 semantic entrykernel-package-upgrade-family-retired, and oneSTEP18_RATIONALEfragment. TheUpgradePlan.estimatedDurationtombstone'sRETIRED_KEYS_BY_MAJOR[18]entry and the D3 entrykernel-package-lifecycle-durations-unit-in-keystay as history (pinned).PackageUpgradeResponse.datais a non-strict object bound to no route, so itsplanleaves without a tombstone (route 3: nothing parses it); a pin asserts a strayplanis stripped.What changed
src/kernel/package-upgrade.zod.tsand its test; the re-export insrc/kernel/index.ts(a comment block stays in its place naming the retirement); the upgrade section ofsrc/contracts/package-service.tsand its test cases;planinsrc/api/package-api.zod.ts.src/migrations/entries/retired-defs/18.kernel__*.ts×10,src/migrations/entries/semantic/18.kernel-package-upgrade-family-retired.ts, aSTEP18_RATIONALEfragment insrc/migrations/registry.ts.template.src/kernel/package-upgrade-family-retirement.test.ts(listed invitest.repo-tests.json; its walk radius is the one already declared for@objectstack/specinscripts/cross-package-test-inputs.mjs): zero holders on every public entry, runtime namespaces, the four contract members absent at the type level with a lit control,planabsent from the shape, module gone from disk and unimported, shards clean, ledger wired with no D2 conversion, and tree-scoped absence acrosspackages,examples,skills,content,scripts.json-schema.manifest/kernel.json(−10, deleted deliberately as the manifest-deletion gate requires),authorable-surface/kernel.json(−48, the whole-def route; check (c) re-proved it against the git base),authorable-defaults/kernel.json,api-surface/{kernel,contracts}.json,declaration-map/kernel.json,export-origins/{kernel,contracts}.json,dropped-refinements.baseline.json(two entries and their header totals), the strictness-ledger counts, andcontent/docs/references/**(thepackage-upgradepage is gone).type-alias-convention.pin.test.ts790 → 786 (four isomorphic pins and theM92import),scripts/file-description.test.ts31 → 30 level-1 openers,llms.txt206 → 205 schemas / kernel 31 → 30,quick-reference.mdxkernel 30 → 29.content/docs/upgrading.mdxdescribed a package-upgrade lifecycle (pre-check, plan, snapshot, …) and linked the removed page; it now says what the platform serves — a re-install withoverwrite: trueand the commit rollback — and links Package Management in the Metadata API..changeset/25608-retire-package-upgrade.md,minor(launch-window convention) with the BREAKING banner, the FROM → TO table, both declaration lines andregistered kernel-package-upgrade-family-retired.Tests and gates
All readings below are at head
3e7b204be7(after mergingorigin/mainc61f75d10fthroughscripts/pm/os-regen-merge.sh, thenpnpm install --frozen-lockfile, a fullturbo run buildand@objectstack/specbuild+check:generated), underscripts/pm/os-verify-lock.sh, exit codes captured before any pipe.pnpm --filter @objectstack/spec typecheckpnpm --filter @objectstack/spec testscripts/liveness/check-liveness.test.ts, each naming the main-red belowpnpm --filter @objectstack/spec test:repopnpm --filter @objectstack/cli test(unit and integration projects)pnpm --filter @objectstack/dogfood test(the(narrowing)arm's full battery)pnpm --filter @objectstack/metadata-protocol test(pre-merge head80ed3baba1)sys-comment-retired-fields.test.ts, service-automationdecision-overlapping-edge-conditions.pin.test.ts(both read the ledger; pre-merge)node scripts/check-platform-checklist.mjs --changed-from origin/mainDerived gates.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat3e7b204be7: 120 families. Every one run;--ranreconciles: "120 derived famil(ies) accounted for — 120 run, 0 NOT-MEASURED (a DERIVED zero — all 120 recorded an exit code and none of them is 3)". 118 exit 0, includingcheck-adr-0087-registration,check-changeset-no-major,check-empty-changeset,check:api-surface,check:authorable-surface,check:docs,check:llms-txt,check:quick-reference-counts,check:spec-parsed-alias,check:cross-package-test-inputsandcheck:nul-bytes. Two are red, both the main-red below:check:livenessandcheck:generated(whose only stale artifact isliveness/state-counts/).Main-red, not this PR's.
check:livenessrefusestranslation/flows.screens → packages/services/service-automation/src/engine.ts: the citation names a file that no longer names the property. Reproduced on a cleanorigin/mainc61f75d10fworktree (exit 1, same line). The service-automation refactors that moved bodies out ofengine.ts(#25725, #25734) movedrenderFlowTextSlottopackages/services/service-automation/src/node-text-rendering.ts. The proposed patch, not carried here because it is outside this diff: inpackages/spec/liveness/translation.json, re-point that row'sengine.ts#renderFlowTextSlotevidence tonode-text-rendering.ts#renderFlowTextSlot. No fix PR existed to port when this was measured.Ablation (reverse verification of the pin). The pin imports
src, so there is nodist/leg. Throughnode scripts/ablation-replace.mjson the committed tree, I replaced the retirement comment insrc/kernel/index.tswithexport * from './package-upgrade.zod';(anchor 1 → 0, blobbaf1437875cf→cc18be2f5671) and restored the module from the base under an EXIT trap. Predicted red: runtime namespaces, module-on-disk / importer, and the tree-scoped walk. Predicted green: export-origin holders (they read the committed artifact), shards, registration, the contract type and theplanshape. Observed exactly that: 3 red, 7 green. The restore was blob-identical toHEAD(baf1437875cf),git diff HEADwas empty, and the restored module was deleted. A first attempt was a recorded no-op (its replacement kept the anchor, so the tool refused it) and is not counted.Downstream. objectui main
a3c0da9/ pin2958f17e9c, and hotcrma4b3560: zero hits (table above). No objectui fix or pin bump is needed.Acceptance notes
content/docs/protocol/kernel/lifecycle.mdx§ Upgrades describesobjectstack upgradestrategies and pre-upgrade backups as design intent, flagged as such at the top of the page; it never cited the retired spec and this diff does not make it false. Not touched.PackageUpgradeRequestSchema/PackageUpgradeResponseSchemastay published and bound to no route (recorded by the existing D3 entrypackage-api-contracts-unmounted-entries-retired); retiring them is outside this card.change-management-family-retired(history) still sayskernel/MetadataChangeTypewas "a different declaration with a live consumer" and "unaffected". That was true of that retirement; its only reader was the module retired here. Left as history.🤖 Generated with Claude Code
https://claude.ai/code/session_01T5pRzjp4QpCwioKZ9Gt5tC
Generated by Claude Code