Repository navigation
feat(spec)!: a view no longer declares itself personal — scope 'personal' and sharing.type retire - #29447
Conversation
`scope: 'personal'` leaves ViewScopeSchema (enumWithRetiredValues) and `sharing.type` leaves ViewSharingSchema (retiredKey tombstone, the released `collaborative` default accepted as residue). Nothing ever restricted a view to one user, so a view marked personal was listed for everyone under a badge that said otherwise. ADR-0087 kit: D2 `view-personal-declarations-removed`, D3 `ui-view-personal-declarations-retired`, retired key `ui/ViewSharing:type`. The console list toolbar draws only the lock from `sharing.lockedBy`; the legacy visibility fold writes no type. Claude-Session: https://claude.ai/code/session_01ADHkmTHDhPHuivpyvN8gfF Co-authored-by: Claude <noreply@anthropic.com>
…aration retirement; changeset Claude-Session: https://claude.ai/code/session_01ADHkmTHDhPHuivpyvN8gfF Co-authored-by: Claude <noreply@anthropic.com>
…n order; read union-door issues through invalid_union Claude-Session: https://claude.ai/code/session_01ADHkmTHDhPHuivpyvN8gfF Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADHkmTHDhPHuivpyvN8gfF Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): ⛔ 1 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 168 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 b05c3ad60190f47bdc32d0357a0ea67208779d4a && git checkout b05c3ad60190f47bdc32d0357a0ea67208779d4a
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a644163669cc57d6d1471008caad6099f1f49413 92ac574df7221a069c1a7047e0c29b1c008d69a5 && git checkout -B drift-repro a644163669cc57d6d1471008caad6099f1f49413 && git merge --no-ff 92ac574df7221a069c1a7047e0c29b1c008d69a5
node scripts/docs-audit/affected-docs.mjs --json a644163669cc57d6d1471008caad6099f1f49413
|
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Head-sha: 维护者速读
席位意见:可落地,等契约复审。 席位核对 — ACCEPT ·
|
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Contract-review-claim: session_01ADHkmPi25XXKx92Xmg4viS · head 92ac574 · 2026-11-02T16:20Z |
|
domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS Contract reviewServed-tier: Inputs read: card #29037 (body, triage 6571434336, seat claim 6578962562, dev report 6582129886, claim amendment 6582177714), the ruling of record 6570568131 on #28971 (letter C, 「同意」), the PR body, its file list, ① Derived judgmentsThe accept-set narrowing —
Nothing refused beyond ruling C and the card. The D2 conversion covers every shape the narrowing newly refuses. Newly refused stored shapes are (a) ② Semver level
③ Boundary flags
④ Design judgment
No must-fix found. The retirement is complete on every door, every stored shape converts, the declaration is consistent and at the right level, and the surface breach is exactly what the retirement forces. Implemented-by: VERDICT: PASS |
Requested by Steve · project thread
Fixes #29037
Clause-②: no (narrowing)
Metadata-protocol: narrowed
维护者速读
scope: 'personal'和列表视图的sharing.type都被拒收并给出改法;控制台列表工具栏不再显示"个人视图 / 共享视图"标签,只保留"由谁锁定"。collaborative照收并丢弃,所以现有视图不用改就能加载;回滚就是 revert 本 PR。packages/spec/src/ui/view.zod.ts(两处退役与改法文案)和packages/spec/src/conversions/registry.ts的personalViewDeclarationsRemoved转换。pnpm --filter @objectstack/spec exec vitest run --project repo src/ui/view-personal-declarations-retirement.test.ts,看personal两处被拒、collaborative被丢弃、转换后的行能通过。collaborative残留是照收丢弃还是一起拒收(默认按 feat(spec): retired-defaulted-key tolerance — the retired default parses as inert residue and strips; non-default values keep the loud refusal (#12497 class rule) #12840 惯例照收丢弃)。What changes
Per ADR-0049 enforce-or-remove and ADR-0087, the two inert
personaldeclarations retire.view.scope: 'personal'is refused byenumWithRetiredValueswith a prescription at every door that reads a view item'sscope:ViewItemSchema, the wire schema, theViewMetadataSchemarecord and overlay arms, andAssembledViewArtifactSchema.packageandsharedare unchanged.view.list.sharing.typeretires as a whole key with aretiredKeytombstone, not just itspersonalvalue. Oncepersonalgoes,collaborativeis the only value left, and the only reader was the console badge. A measuredgit grepover packages/ and ui/ finds no server, runtime or service reader.lockedBystays.type: 'collaborative', which a released toolchain wrote into every parsedsharingblock, is accepted and stripped throughacceptRetiredDefaultResidue(house rule feat(spec): retired-defaulted-key tolerance — the retired default parses as inert residue and strips; non-default values keep the loud refusal (#12497 class rule) #12840).type: 'personal'is refused.view-personal-declarations-removed(identifierpersonalViewDeclarationsRemoved,retiredFromLoadPath: true,retiredAfter: '18.2.0') serves stored-row rehydration, assembled artifacts andos migrate meta. It stripsscope: 'personal'fromviews/viewItemsrows, andsharing.typefrom list payloads, list view item configs, flattened list overlays andobjects[].listViews.*. Route: it deletes the declaration and does not inventshared, because nothing a reader sees changes.ui-view-personal-declarations-retiredcarries the part a migration cannot decide (keep the view as everyone-visible, delete it, or wait for user-owned personal views). One ADR-0087 marker sits in the changeset. There is also aRETIRED_KEYS_BY_MAJORentryui/ViewSharing:typeand a STEP18 rationale fragment.ui/packages/plugin-list/src/ListView.tsx: the personal/shared badge is gone, and a view withsharing.lockedBystill shows "Locked by …" (data-testid="sharing-locked-by").ui/packages/core/src/utils/normalize-list-view.ts: drops the legacysharing: { visibility, enabled }pair instead of folding it onto the retiredtype.list.sharingPersonal/list.sharingCollaborativeare removed from all 10 locales.content/docs/ui/audience-based-interfaces.mdxnow says per-user list preferences instead of personal views. The liveness rowview.json#list.sharingis re-cited to the lock reader.authorable-surface/ui.json,authorable-defaults/ui.json, andcontent/docs/references/{api/protocol,data/object,ui/view}.mdx.Forced test edits
These are existing tests that pinned the retired values, and each one changes only its fixture:
packages/spec/src/ui/view.test.ts: theViewSharingSchemadescribe was rewritten (an empty block parses to{}, and the lock is accepted). Three list-view literals change fromsharing.typetosharing.lockedBy.packages/spec/src/ui/view-item-owner-hidden-retirement.test.ts: the bystander row'sscope: 'personal'changes to'shared'. The owner/hidden conversion fixture inconversions/registry.tsgets the same edit.packages/spec/src/ui/view-overlay-viewkind-arm.test.ts:{ sharing: { lockedBy: 'admin' } }.packages/metadata-protocol/src/protocol.graft-folded-form-sections.test.ts:{ sharing: { lockedBy: 'admin' } }.ui/packages/plugin-list/src/__tests__/ListView.test.tsx: the sharing tests were rewritten aroundsharing-locked-by.ui/packages/plugin-list/src/__tests__/ListViewBlock.inertKeys-13074.test.tsxandListViewBlock.specInputs-13047.test.tsx: they mount{ sharing: { lockedBy: 'admin' } }and assertsharing-locked-by.ui/packages/core/src/utils/__tests__/normalize-list-view.test.ts: the legacy pair is dropped, and notypeis written.ui/packages/plugin-view/src/__tests__/ObjectView.namedViewProtocolKeys-8980.test.tsx:lockedByvalues.ui/packages/types/src/__tests__/p1-spec-alignment.test.ts:{ lockedBy }only.ui/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts: thelist-view.sharingreason prose.New test file:
packages/spec/src/ui/view-personal-declarations-retirement.test.ts. It covers every door,defineStack422, the type-level pins, the D2 conversion and the D3 entry, plus a tree-scoped absence walk.Generated by Claude Code