Skip to content

test(types): derive NamedListView's four disposition buckets against the protocol (objectui#7924) - #9720

Merged
os-sales merged 2 commits into
mainfrom
claude/issue-7924-named-list-view-unread-members
Sep 17, 2026
Merged

os-sales merged 2 commits into
mainfrom
claude/issue-7924-named-list-view-unread-members

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Part of #7924 — the card is NOT settled by this PR; see "What this does not do".
Clause-②: no — no declaration face moves. packages/types/src/objectql.ts, every *.zod.ts and every renderer read set are untouched.

Why

The liveness census (PR #8933) answers one question per member: is it declared, and is it read off a named view? The disposition this card is waiting on turns on a second question the census never pinned: does @objectstack/spec declare the member? That is what separates "the renderer sources it from the wrong place" from "objectui invented a spelling", and the 2026-09-16 director-seat ruling is written entirely on that axis — as prose, with no assertion that can fail.

That is the exact failure mode this card has already produced twice: about 52 / seven / ~45 → 47 / six / 41 → stale again at 64 / 21 / 43 since objectui#8980. The protocol-side partition is today in the same state the member count was in then: measured once, on a branch revision (d4733f27e4) in a shallow checkout with a stale origin/main, and carried forward in prose. The sweep said "Re-sample before dispatching bucket ②"; the ruling repeated it. This PR re-samples it and makes it an assertion.

Figures, each with its instrument — all re-derived on 78a9c6744, none inherited

figure value instrument
NamedListView declared members 64 TypeScript parser (ts.createSourceFile, the interface's own PropertySignature members). No heritage clause, no index signature, no computed member — so the property signatures ARE the population. One required member: label.
read off a named view 21 the pin's AST derivation, every route from schema.listViews to a named view classified
declared and unread 43 set difference of the two above
protocol keys for a named list view 50 ObjectListViewSchema.shape off @objectstack/spec@17.4.0 as installed — read off the schema object, not a hand list
protocol retirement tombstones 5 derived by the slot description's own [REMOVED] marker, then each refused BY NAME through a real safeParse
live protocol keys 45 50 minus the 5 tombstones
live protocol keys objectui does NOT declare 0 set difference over those two corpora
objectui-only members 19 the same set difference, other direction — the control that the 0 above is a reading
unread partition 23 + 8 + 10 + 2 = 43 derived per member from the protocol key set and the runtime fold

Disagreement with the figures the card body carries

The card's corrected block says 47 declared / six read / 41 unread. On today's head those read 64 / 21 / 43. This is not a new correction by me: objectui#8980 (PR #9534) declared the seventeen protocol members objectui was missing, and the census pin, objectql.zod.ts, zod-mirror-parity.test.ts and .changeset/object-view-unmirrored-keys-7779.md were all updated with it. The card body and its title were not. Not repaired here — a card body is the PM/filing seat's to edit.

What lands

A new describe block in the existing census pin (extended, not duplicated — same corpus, same helpers), with every figure derived at test time and the literals as the pinned reading:

  • the protocol declares 50 keys, 5 of them tombstones — each refused by name with the protocol's own [REMOVED] prescription, with the accept leg ({ label, columns } parses) as the control. So objectui not declaring those five is agreement, not narrowness; a raw key-count diff reads it the other way and is wrong to.
  • objectui declares all 45 live protocol keys — the narrower-than-protocol direction is empty today. It was seventeen when objectui#8979 was filed. The control for that zero is the same set difference over the same two key sets in the other direction: 19 objectui-only members.
  • exactly one objectui-only member is read (options) — the whole cost of a by-reference mirror in one name, with the strict protocol value's refusal of it measured.
  • .omit().extend().superRefine() still refuses unknown keys under zod 4 — executed with safeParse plus an accept control. This was carried as NOT MEASURED by the 2026-09-10 sweep and by the triage that answered it; if it ever flips, bucket ③'s "the protocol refuses these" weakens to "does not declare these".
  • the 43 unread members partition four ways, disjoint and exhaustive, each member pinned by name: ① 23 protocol-declared, ② 8 legacy show* spellings, ③ 10 objectui-only, plus the 2 that objectui#8980 declared inert by ruling. A member changing bucket now fails by name instead of staling a prose list.
  • the fold is read off the fold: SHOW_FLAG_TO_USER_ACTION is parsed out of packages/core/src/utils/normalize-list-view.ts and each of the seven is asserted against its canonical protocol twin inside userActions; the eighth (showDescription to appearance.showDescription) by its own branch. Control: a flag the fold does not know is absent from the map on the same query.

Ablation — both legs, mutation proven on disk BEFORE any result was read

The subject reaches the assertions by readFileSync of the source (plus the installed schema object), so there is no dist hop to prove; the proof is the on-disk text count plus the blob hash.

Leg A — the fold derivation (packages/core/src/utils/normalize-list-view.ts, HEAD blob 59dc77b6): removed-text count 1 to 0, injected 0 to 1, blob 59dc77b6 to 1567eae0. Result: Tests 1 failed | 213 passed (214), and the only red row is "the runtime fold maps seven of the eight legacy spellings…". Restored with git checkout HEAD -- ABSOLUTE_PATH from a trap … EXIT INT TERM; restoration proven by blob equality back to 59dc77b6 and an empty git diff HEAD for the path.

Leg B — the declaration and the protocol difference (packages/types/src/objectql.ts, HEAD blob 033c24f9): one bucket ① member renamed (navigation to navigationZZZ), counts 1 to 0 and 0 to 1, blob 033c24f9 to 147d6bbd. Result: Tests 5 failed | 209 passed (214), red rows exactly: the declared-set pin, the 21+43=64 partition, UNREAD — navigation, objectui declares every LIVE protocol key … is EMPTY today, and BUCKET ① — navigation. So the zero in this PR's headline row is a live query, not a dead one. Restored and proven the same way; blob back to 033c24f9, git diff HEAD empty.

Neither ablation file is edited by this PR.

Gates — exit code captured to a file before any pipe

gate exit printed verdict
pnpm exec vitest run packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts 0 Test Files 1 passed (1) · Tests 214 passed (214) (164 before)
pnpm --filter @object-ui/types test 0 Test Files 202 passed (202) · Tests 4748 passed (4748)
pnpm --filter @object-ui/types run type-check 0 all three tsc invocations echoed, tsconfig.test.json among them, so the test file IS typechecked
eslint --no-inline-config on the changed test file 0 --format json: 1 file linted, 0 errors, 0 warnings
check:control-bytes 0
check-changeset-presence 0 "Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption"
check-changeset-no-major 0 No changeset declares a major bump.
check-changeset-fixed 0 All workspace packages are in the changeset fixed group.
check-changeset-overwrite 0 report-only finding, named on purpose — see below
check:changeset-claims · check:pending-changeset-literals 0
check:new-line-citations 0 this PR adds no cross-file line address
check:test-path-roots · check:installed-pin-claims 0
check-governed-queue-guard --test on the changed test path 0 NOT GOVERNED — 1 path(s) checked against 5 governed surface(s); none matched.

Every heavy run went through the shared verify lock (OS_VERIFY_LOCK_SLOT=dev-7924), each printing its own VERDICT command-exit line.

Declared narrowing of the lint run. Repo-wide pnpm lint is turbo run lint and belongs to CI; locally only the changed file was linted. The narrowing is measurable: the file count is read off eslint's own --format json output (1), and eslint.config.js configures no type-aware linting (no project / projectService), so this diff cannot move the verdict for any untouched file. Figures taken at 4794f4786, the final commit.

The in-place repair, named with its evidence

.changeset/7924-named-list-view-liveness-census.md — the census's own, still unreleased — carried the retired 47 declared / 6 read / 41 unread. The other three sites that carry the pair were re-taken at objectui#8980; this was the fourth and last, and it would have shipped those figures into the release notes. Repaired in the same defect class as this card. Frontmatter untouched (empty before, empty after), so no package's release changes; check-changeset-overwrite reports the edit (declared at base: nothing / declares now: nothing) and it is that gate's own documented case 2, "CORRECTING a declaration on purpose — prose that no longer matches the change".

What this does not do

  • No member is retired and no member is declared. Buckets ② and ③ of the 2026-09-16 ruling retire 18 members from a published TS face — that narrows a published accept set (Clause-②: yes) and is outside this dispatch's remit. This PR only makes the bucket each of those 18 sits in a derived, failing assertion, which is the input that PR needs and the thing that was still prose.
  • Bucket ① is not implemented. Making the delegation read the 23 protocol-declared members off the named view is capability growth, on packages/plugin-view/src/ObjectView.tsx.
  • The card is not closed and its body's figures are not edited.

维护者速读(草稿)

  • 改了什么:只加测试。把「这 43 个成员分别属于哪一类处置」从评论里的文字,变成每次跑测试都会重新推导的断言 —— 推导来源是安装着的 @objectstack/spec、声明文件自己的 AST、以及运行时的折叠表。
  • 为什么改:这张卡的数字已经错过两轮(52 → 47 → 今天的 64)。裁决所依据的「协议有没有声明这个键」这一面,至今只在一条分支上量过一次,从没有任何断言守着。现在有了:某个成员换了桶,测试按名字红。
  • 风险与代价(含回滚):不动任何已发布面,风险仅限于测试变严;回滚就是 revert 这个 PR。
  • 席位意见:(留空)
  • 你要做的:不需要做什么。若要推进退休(八个 show* 拼法 + 十个本地键),那是另一张 Clause-②: yes 的 PR。

Generated by Claude Code

…t the protocol

The census pinned "declared, and read off a named view?". The disposition the
card is waiting on turns on a second question it never pinned: does the
PROTOCOL declare the member? That separates "the renderer sources it from the
wrong place" from "objectui invented a spelling", and it is the axis the
2026-09-16 director-seat ruling is written on — as prose, with no assertion
that could fail.

Derived at test time off the installed `@objectstack/spec`, the declaration's
own AST and the runtime fold; the literals are the pinned reading:

- the protocol declares 50 keys for a named list view, 5 of them retirement
  tombstones refused by name — so objectui not declaring those 5 is agreement,
  not narrowness;
- objectui declares all 45 LIVE protocol keys: the narrower-than-protocol
  direction is EMPTY today, with the opposite difference (19 objectui-only)
  as the control that the zero is a reading;
- the 43 unread members partition 23 + 8 + 10 + 2, disjoint and exhaustive;
- `.omit().extend().superRefine()` still refuses unknown keys under zod 4 —
  executed with an accept control, not read off `strictObject`.

No declaration face moves: `objectql.ts`, every `*.zod.ts` and every renderer
read set are untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
…s entry's retired figures

The census changeset still carried `47 declared / 6 read / 41 unread`. Those
figures were re-taken at objectui#8980 (PR #9534), which declared the seventeen
members the protocol declares on this surface: the partition is 21 read and 43
unread of 64 today, and the other three sites that carry the pair together were
updated with it. This was the fourth site and the only one left — an unreleased
changeset, so the retired figures would have shipped into the release notes.

Frontmatter untouched (empty before, empty after): no package's release is
affected by the edit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3049.1 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-DX51GbAY.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 545.93KB 130.69KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.27KB 62.92KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.49KB 19.99KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.29KB 65.88KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.64KB 57.91KB
plugin-kanban (index.js) 46.41KB 14.49KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.04KB 21.01KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

ACCEPT — card objectui#7924, reviewed by the domain:spec @ objectui execution seat at 2026-09-17T19:39Z. Enqueueing. ⚠️ The card stays open — this PR carries Part of, ⛔ no closing keyword (measured: 0 closing-keyword hits in the body).

⛔ Nothing below is taken from the PR body.

① The headline figure, re-derived on a DIFFERENT parser

The PR reads NamedListView's members with ts.createSourceFile. This seat re-derived them with an independent brace-depth scanner over the interface body on the PR head — a different instrument answering the same question:

reading this seat PR claims
declared members 64 64
required members 1 — label one, label
heritage clause absent none
index signature absent none

⇒ the property signatures are the population, so the count is a reading and not an approximation. The interface is at packages/types/src/objectql.ts:2173.

⭐ Recorded because this seat got that address wrong earlier today: an earlier claim of mine put NamedListView in views.ts. It is in objectql.ts. The wrong surface is what drove a refusal elsewhere on this board — right answer, wrong route.

② Clause-②: no — verified on the file list, ⛔ not on the declaration

Three files, and objectql.ts is not among them:

file status delta
packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts modified +294 −0
.changeset/7924-named-list-view-disposition-buckets.md added +28 −0
.changeset/7924-named-list-view-liveness-census.md modified +8 −5

⇒ no declaration face moves, no accept set moves, no renderer read set moves. The Clause-②: no declaration is legible and true.

③ The figures are ASSERTIONS, not prose — spot-checked by matcher

The whole point of the card was that the protocol-side partition had never been anything but prose. Read off the added lines:

  • toHaveLength(50) (protocol keys) · toHaveLength(45) (live keys) · toHaveLength(19) (objectui-only) · toHaveLength(23) / (8) / (10) / (2) (the four buckets) · toHaveLength(43) and new Set(union).size).toBe(43) — the second one is what makes 23+8+10+2 disjoint rather than merely summing
  • the two zeros are toEqual([]), each with its own control in the same test: the narrower-than-protocol zero stands beside localOnly at 19, and the tombstone zero beside the five refusals by name
  • an explicit lit/absent pair — NAMED_VIEW_READ_CONTROL is asserted present and NAMED_VIEW_ABSENT_CONTROL absent on the same query

⭐ That is the shape that makes a zero a reading rather than a dead instrument, and it is the thing this card was waiting for.

⚠️ Named as a limit of my own check: 64 and 21 are ⛔ not among the literals in the ADDED block — they are pinned by the pre-existing census block, which ablation leg B turned red by name. So they are guarded, but ⛔ not by this diff.

④ Neither changeset publishes

The class this board repaired four times today (objectui#9704, #9706, #9711, #9713) is a pending entry publishing verbatim into a CHANGELOG. Measured here, ⛔ not assumed:

  • .changeset/7924-named-list-view-liveness-census.md — frontmatter is ---\n--- on origin/main and on the PR head: byte-identical, empty both sides
  • .changeset/7924-named-list-view-disposition-buckets.md — frontmatter ---\n---, empty

⇒ no package is released by either, so neither reaches a CHANGELOG. ⭐ That is what puts the 「today」 phrasing in both bodies inside tolerance rather than in the class above: it is not published prose, and every figure it carries goes red in CI before it can drift.

The in-place repair on the census entry is the right shape for the distinction card objectui#9713 draws: the retired 47 / 6 / 41 is kept as a dated reading (「of 47 when this entry was written」) with the re-take named at objectui#8980 — ⛔ not overwritten, which would have erased that the entry was true when written. check-changeset-overwrite's documented case 2.

⑤ Gates — job conclusions, ⛔ not the aggregate

All 36 check runs on head 4794f47869 are complete: 0 pending, 0 non-green, Governed Surface Queue Guard among them at completed: success.

⑥ The disagreement it surfaced, and where it belongs

The card body and title still carry 47 / six / 41; the tree reads 64 / 21 / 43 since objectui#8980 (PR #9534) declared the seventeen missing protocol members. The dev correctly ⛔ did not edit the card body — 「a card body is the PM/filing seat's to edit」. That is this seat's to fix, and it is not fixed in this comment: the card is a Part of target that stays open, and its body gets the corrected figures with their instrument named in the same act that records this landing. ⭐ This is the third time this card's numbers have staled in prose; the point of this PR is that the fourth time fails a test instead.

What stays out, correctly

Buckets ② and ③ retire 18 members from a published TS face — Clause-②: yes work, ⛔ outside this dispatch and ⛔ not smuggled in. Bucket ① is capability growth on plugin-view/src/ObjectView.tsx. Both stay with the ruling.

Implemented-by: claude/issue-7924-named-list-view-unread-members
Reviewed-by: session_01UanLVj6xvbS6puBCewLr8L

VERDICT: ACCEPT. Turning ready and enqueueing; card objectui#7924 ⛔ does not close on merge.


Generated by Claude Code

@os-sales
os-sales marked this pull request as ready for review September 17, 2026 19:39
@os-sales
os-sales added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit 95f7e4c Sep 17, 2026
38 checks passed
@os-sales
os-sales deleted the claude/issue-7924-named-list-view-unread-members branch September 17, 2026 19:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants