Skip to content

Commit c3a26cc

Browse files
refactor(types,plugin-kanban): retire ColumnWidthConfig / ColumnWidthConfigSchema (objectui#10582) (#10730)
Fixes #10582 Clause-②: yes ## What this does Deletes `ColumnWidthConfig` (`packages/types/src/complex.ts`) and its Zod mirror `ColumnWidthConfigSchema` (`packages/types/src/zod/complex.zod.ts`), together with both `@object-ui/types` barrel exports (`src/index.ts`, `src/zod/index.zod.ts`) and the `@object-ui/plugin-kanban` re-exports (`src/types.ts`, `src/index.tsx`). This is ADR-0049 enforce-or-remove on a declaration that no key references and nothing reads. The governing direction is triage's written retire direction on the card (first grade, comment `5831964491`), not a maintainer ruling. - The kanban retirement docblock in `complex.ts` no longer says the type survives. It now says `ColumnWidthConfig` lost its one reader to objectui#8522 and is deleted here, and it points at the pin. - `zod-mirror-parity.test.ts`: the `complex.zod.ts#ColumnWidthConfigSchema` pair leaves `MIRRORS`, `Declared` and the two import lists. `EXPECTED_MIRROR_PAIRS` follows the registry down by one, which is what the census failure message instructs ("update EXPECTED_MIRROR_PAIRS ... and nothing else"). The header sentence that names the pair under objectui#7664 is history and stays as it is. - New pin: `packages/types/src/__tests__/column-width-config-retired-10582.test.ts`. - `.changeset/10582-retire-column-width-config.md`: `minor` for `@object-ui/types` and `@object-ui/plugin-kanban`, with the breaking semantics and a migration section. No `major`. ## Premise, re-measured on `origin/main` `5c61e5241` (in-repo evidence only) - `git grep ColumnWidthConfig` over the whole tracked tree. Outside `.changeset/`, it hits only the declaration, the mirror, the four re-exports, docblocks and the parity ledger. Per directory, case-insensitive, with a lit control on the same instrument: - `content/`: 0 hits (control `KanbanSchema`: 19); - `examples/`: 0 hits (control `KanbanSchema`: 3); - `apps/`: 0 hits (control `@object-ui/types`: 32); - `skills/`: 0 hits (control `@object-ui/types`: 17). There is no governed row to split out. - Shape level: `defaultWidth` appears only in the type and the mirror. No schema key references either name. The one key that did, the `'kanban'` arm's `columnWidths`, retired with that arm (objectui#8802). - No reader, no producer and no doc that teaches building one were found, so the stop condition did not fire. - **H2 measured:** `one-authority-per-exported-name-6273.test.ts` has no ledger row for the name. It has one historical comment inside the objectui#7664 narrative, and that comment stays true as history. The file is not edited. - **H4, sharpened:** I read the published 17.6.0 tarballs from npm. - `@object-ui/plugin-kanban@17.6.0` exports `ColumnWidthConfig` from its entry. There it is the package's own declaration, and `KanbanSchema.columnWidths` is typed with it. - `@object-ui/types@17.6.0` exports neither name (lit control: `BaseSchema` appears in 42 files of the same tarball). The pair entered `@object-ui/types` in this unreleased window with objectui#7664, so for that package it leaves before any version publishes it. The changeset says so. - Consumers outside the repo cannot be measured from here. - **H5, precedent followed:** objectui#7068's retirement of `ActionCallback` / `ActionCallbackSchema`. There, a standalone retired pair is DELETED rather than tombstoned, and its absence is pinned (`action-callback-retired-7068.test.ts`). A tombstone (`?: never` / `retirementTombstone()`) exists for a member key under `.passthrough()`. A standalone type has no such hatch: an importer gets TS2305, "has no exported member", which is the loud refusal. The objectui#8522 retirement of `useColumnWidths` (PR objectui#10549) was a plain deletion too. I found no tombstone-export convention for retired type names in this repo. ## The pin, and proof that it can fail The pin has three readings, each with a lit control on the sibling `CardTemplate` / `CardTemplateSchema` that did not retire: 1. The `ColumnWidthConfigSchema` name is `in` neither `complex.zod.ts` nor the `@object-ui/types/zod` barrel, checked at runtime. 2. `complex.ts` declares no `ColumnWidthConfig`, and neither entry file (`index.ts`, `zod/index.zod.ts`) exports either name. Both are read off the AST, so the docblocks that tell the story do not count. 3. Tree-scoped: no TypeScript source under `packages/`, `apps/` or `examples/` declares or exports either name. A re-declaration in another package would type-check cleanly, and only this reading sees it. Each mutation leg went through `ablation-replace.mjs`. Its anchor had to hit, the landing was proven by the blob hash, and the restore was proven by blob == HEAD and an empty `git diff HEAD`. The pin imports relative `src` paths, not a package `exports` specifier, so no dist build sits between the mutation and the reading. | leg | mutation | predicted | observed | | --- | --- | --- | --- | | A1 | re-plant `export const ColumnWidthConfigSchema` in `complex.zod.ts` | readings 1 and 3 red | 2 failed / 4 passed | | A2 | re-declare `export interface ColumnWidthConfig` in `plugin-kanban/src/types.ts` | only reading 3 red | 1 failed / 5 passed; offender `packages/plugin-kanban/src/types.ts: ColumnWidthConfig` | | A3 | re-add `ColumnWidthConfig` to the `index.ts` export list | readings 2 and 3 red | 2 failed / 4 passed | The first A1 attempt was a null run. The replacement contained the anchor, so the tool refused because the anchor count could not drop. It restored the file and measured nothing. The leg was rerun with a disjoint anchor, and the table records that rerun. **Reverse check on the consumer side:** the `@object-ui/types` dist was rebuilt, and its one `ColumnWidthConfig` hit is the docblock sentence. I re-planted `ColumnWidthConfig` in `plugin-kanban/src/types.ts`'s re-export list and ran `pnpm --filter @object-ui/plugin-kanban type-check`. It went red with `error TS2305: Module '"@object-ui/types"' has no exported member 'ColumnWidthConfig'`, and the restore was proven. This shows the green type-check reads the rebuilt `.d.ts`, not a cached one. ## Verification, on HEAD `1f612da39` Each exit code was captured before any pipe. - `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-kanban^...' build`: exit 0 (13 of 47 projects, including `@object-ui/types`). - `pnpm --filter @object-ui/types type-check`: exit 0. - `pnpm --filter @object-ui/plugin-kanban type-check`: exit 0. - `pnpm exec vitest run packages/types/`: exit 0, 241 files and 5283 tests passed. - `pnpm exec vitest run packages/plugin-kanban/`: exit 0, 64 files and 420 tests passed. - `pnpm exec vitest run` over the six `scripts/__tests__` suites that read a touched file (`one-authority-per-exported-name-6273`, `check-handler-key-read-sites`, `check-prompt-component-keys`, `docs-build-trigger`, `vite-objectstack-spec-dist`, `vite-types-zod-lazy`): exit 0, 6 files and 235 tests passed. - `node scripts/check-changeset-presence.mjs`: exit 0. `node scripts/check-changeset-no-major.mjs`: exit 0. `node scripts/check-changeset-fixed.mjs`: exit 0. - `pnpm check:new-line-citations`: exit 0, with the verdict line reading 0 new citations. `pnpm check:control-bytes`: exit 0. `pnpm check:spec-symbols`: exit 0. `pnpm check:test-path-roots`: exit 0. - `pnpm check:handler-key-reads`: exit 0. `pnpm check:doc-types`: exit 0. - `node scripts/check-governed-queue-guard.mjs --test` over the 9 changed paths: exit 0, NOT GOVERNED. - ESLint with `--no-inline-config` on the 8 touched `.ts`/`.tsx` files: 1 error and 37 warnings. Every one of them is pre-existing. The per-file counts are identical when the same command lints the base blob of each file through `--stdin`, and the new pin has none. The 1 error is the `no-restricted-imports` finding on the `FormField` re-export in `packages/types/src/index.ts`, and it is present on the base blob. ## Acceptance notes - **Pending changesets that this retirement supersedes.** `check:changeset-claims` (report-only) asked for 35 pending bodies to be re-read. Four of them name the type: - The objectui#8522 entry says "`ColumnWidthConfig` stays exported from `@object-ui/types` and from this package." That was true of that change. - The two objectui#7664 entries list the pair among the declarations that moved into `@object-ui/types`. - The objectui#7742 entry carries a dated note saying the type has no reader. This PR's own entry states the supersession in the same release section, for both packages. It edits none of those four files, because they are outside the claimed file surface. If the seat prefers an in-body dated note on the objectui#8522 entry, following the precedent where objectui#8522 added one to objectui#7742, it is a one-paragraph, prose-only edit. - **Shared ledger.** objectui#10608 may also delete rows from `zod-mirror-parity.test.ts` and move `EXPECTED_MIRROR_PAIRS`. Whichever PR lands second merges `main` (no rebase, no force-push) and takes the constant from the registry, as the census message says. PR objectui#10710 edits `packages/types/src/index.ts` in a separate hunk. - **Spec Main Shape Gate: not applicable.** Neither deleted declaration is spec-derived: both are plain local declarations with no `@objectstack/spec` reference, so objectui's compile against objectstack `main` cannot move with this diff. - **`check:readme-exports` not run.** No README names either symbol (whole-tree grep above), and the gate needs every package built. - `check:test-path-roots` classifies the pin's four filesystem reads as "unknown", because they go through a parameter or a loop binding. Every one of them is rooted at the pin's own `import.meta.url`, which is the same shape as the `action-callback-retired-7068` walk. Dev session: `https://claude.ai/code/session_014fWVhLzhxR8qrFsJ5o8TYW` (seat `domain:spec#1`, claim comment `5851641050`). --- _Generated by [Claude Code](https://claude.ai/code/session_014fWVhLzhxR8qrFsJ5o8TYW)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5c61e52 commit c3a26cc

9 files changed

Lines changed: 191 additions & 38 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
'@object-ui/types': minor
3+
'@object-ui/plugin-kanban': minor
4+
---
5+
6+
**BREAKING (scored `minor` per this repo's version-alignment convention)** —
7+
`ColumnWidthConfig` and its Zod mirror `ColumnWidthConfigSchema` are deleted
8+
(objectui#10582, ADR-0049 enforce-or-remove). No schema key references the
9+
type and nothing reads it, so a `ColumnWidthConfig` an author built was never
10+
read by anything.
11+
12+
**Why nothing was behind it.** The one key that carried the type, the
13+
`'kanban'` arm's `columnWidths`, retired with that arm in this release
14+
(objectui#8802). The one reader, the `useColumnWidths` hook in
15+
`@object-ui/plugin-kanban`, was removed in this release too (objectui#8522).
16+
17+
**What each package's published entry loses**, read off the 17.6.0 tarballs on
18+
npm:
19+
20+
- `@object-ui/plugin-kanban`: 17.6.0 exports `ColumnWidthConfig` from its
21+
entry. There it is the package's own declaration, and `KanbanSchema` types
22+
its `columnWidths` member with it. This release exports it no more.
23+
- `@object-ui/types`: 17.6.0 exports neither `ColumnWidthConfig` nor
24+
`ColumnWidthConfigSchema`. Both entered this package in this release, when
25+
objectui#7664 moved the kanban dialect's declarations here, and both leave
26+
before any version publishes them. For these two names, the objectui#7664
27+
entries in this release are superseded by this one.
28+
29+
## Migration
30+
31+
- `import type { ColumnWidthConfig } from '@object-ui/plugin-kanban'` no
32+
longer resolves: TypeScript reports that the module has no exported member of
33+
that name. Delete the import and the annotation that used it. Nothing
34+
replaces the type, and removing it changes nothing at runtime, because a type
35+
import is erased at compile time.
36+
- The objectui#8522 entry in this same release says `ColumnWidthConfig` stays
37+
exported from `@object-ui/types` and from `@object-ui/plugin-kanban`. That
38+
was true of that change. This entry removes it from both.

‎packages/plugin-kanban/src/index.tsx‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ export function bucketCardsIntoColumns(
194194

195195
// Export types for external use
196196
// ⛔ `KanbanSchema` RETIRED with the bare `kanban` node type key (objectui#8802).
197-
export type { KanbanCard, KanbanColumn, CardTemplate, ColumnWidthConfig, InlineFieldDefinition } from './types';
197+
// ⛔ `ColumnWidthConfig` DELETED — no key referenced it, nothing read it (objectui#10582).
198+
export type { KanbanCard, KanbanColumn, CardTemplate, InlineFieldDefinition } from './types';
198199
export { ObjectKanban };
199200
export type { ObjectKanbanComponentProps } from './ObjectKanban';
200201

‎packages/plugin-kanban/src/types.ts‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@
3636
// `kanban` node type key (objectui#8802, maintainer ruling 2026-09-09).
3737
// `ObjectKanbanSchema` (also from `@object-ui/types`) is the surviving face,
3838
// and `ObjectKanban` takes it directly.
39+
// ⛔ `ColumnWidthConfig` is NOT re-exported any more either: it was DELETED from
40+
// `@object-ui/types` (objectui#10582) — no schema key referenced it and, since
41+
// objectui#8522, nothing in this package read it.
3942
export type {
4043
KanbanCard,
4144
KanbanColumn,
4245
CardTemplate,
43-
ColumnWidthConfig,
4446
} from '@object-ui/types';
4547

4648
/**
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/**
2+
* ObjectUI
3+
* Copyright (c) 2024-present ObjectStack Inc.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
/**
10+
* Retirement pin — `ColumnWidthConfig` / `ColumnWidthConfigSchema` are DELETED
11+
* (objectui#10582, ADR-0049 enforce-or-remove: a declaration nothing pulls on
12+
* retires immediately).
13+
*
14+
* ## What stood behind the pair before the deletion
15+
*
16+
* Nothing. The one schema key that carried the type, the `'kanban'` arm's
17+
* `columnWidths`, retired with that arm (objectui#8802), and the arm's named
18+
* refusal now answers the whole `type: "kanban"` literal. The one reader,
19+
* `plugin-kanban`'s `useColumnWidths` hook, was removed by objectui#8522. What
20+
* was left was a published authoring type an author (or an AI) could build and
21+
* nothing would ever read.
22+
*
23+
* ## Why a deletion and not a tombstone
24+
*
25+
* A tombstone (`?: never`, `retirementTombstone()`) exists for a MEMBER KEY,
26+
* because `BaseSchema` is `.passthrough()` and a deleted member would be kept
27+
* unjudged. A standalone type has no such escape hatch: an importer of a
28+
* deleted name fails to compile with "has no exported member", which is the
29+
* loud refusal. That is the route objectui#7068 took for `ActionCallback` /
30+
* `ActionCallbackSchema` and objectui#7664 for the `DeclarativeKanban*` trio,
31+
* and the shape of this pin follows `action-callback-retired-7068.test.ts`.
32+
*
33+
* ## Tree-scoped, not file-scoped
34+
*
35+
* The last block walks every TypeScript source under `packages/`, `apps/` and
36+
* `examples/` for a DECLARATION or an EXPORT of either name — a re-declaration
37+
* in some other package would type-check cleanly and put the dead shape back,
38+
* and a file-scoped pin sees only the files its author thought of. Prose that
39+
* tells the story (docblocks, this file) is not a declaration and is not read
40+
* as one.
41+
*/
42+
43+
import { readFileSync, readdirSync, statSync } from 'node:fs';
44+
import { dirname, join, relative, resolve } from 'node:path';
45+
import { fileURLToPath } from 'node:url';
46+
import { describe, it, expect } from 'vitest';
47+
import ts from 'typescript';
48+
import * as complexZod from '../zod/complex.zod.js';
49+
import * as zodBarrel from '../zod/index.zod.js';
50+
51+
const HERE = dirname(fileURLToPath(import.meta.url));
52+
const ROOT = resolve(HERE, '../../../..');
53+
const SELF = fileURLToPath(import.meta.url);
54+
55+
const RETIRED = ['ColumnWidthConfig', 'ColumnWidthConfigSchema'] as const;
56+
const RETIRED_TOKEN = /\bColumnWidthConfig(?:Schema)?\b/;
57+
58+
/** Every top-level name a source file DECLARES or EXPORTS, read off its AST. */
59+
function declaredAndExportedNames(file: string): string[] {
60+
const kind = file.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
61+
const sf = ts.createSourceFile(file, readFileSync(file, 'utf8'), ts.ScriptTarget.ESNext, false, kind);
62+
const names: string[] = [];
63+
for (const s of sf.statements) {
64+
if (
65+
(ts.isInterfaceDeclaration(s) || ts.isTypeAliasDeclaration(s) || ts.isClassDeclaration(s)
66+
|| ts.isFunctionDeclaration(s) || ts.isEnumDeclaration(s)) && s.name
67+
) {
68+
names.push(s.name.text);
69+
} else if (ts.isVariableStatement(s)) {
70+
for (const d of s.declarationList.declarations) if (ts.isIdentifier(d.name)) names.push(d.name.text);
71+
} else if (ts.isExportDeclaration(s) && s.exportClause && ts.isNamedExports(s.exportClause)) {
72+
for (const e of s.exportClause.elements) names.push(e.name.text);
73+
}
74+
}
75+
return names;
76+
}
77+
78+
/* ── the two entry points: neither exports either name ─────────────────── */
79+
80+
describe('`ColumnWidthConfig` / `ColumnWidthConfigSchema` are DELETED from both `@object-ui/types` entry points (objectui#10582)', () => {
81+
it('the Zod mirror is exported from neither `complex.zod.ts` nor the `@object-ui/types/zod` barrel', () => {
82+
expect('ColumnWidthConfigSchema' in complexZod).toBe(false);
83+
expect('ColumnWidthConfigSchema' in zodBarrel).toBe(false);
84+
// Lit control: the sibling mirror declared beside it still exports through both.
85+
expect('CardTemplateSchema' in complexZod).toBe(true);
86+
expect('CardTemplateSchema' in zodBarrel).toBe(true);
87+
});
88+
89+
it('`complex.ts` declares no `ColumnWidthConfig` — read off the AST, so the docblock that tells the story does not count', () => {
90+
const names = declaredAndExportedNames(resolve(HERE, '../complex.ts'));
91+
expect(names).not.toContain('ColumnWidthConfig');
92+
expect(names).toContain('CardTemplate'); // lit control
93+
});
94+
95+
it.each([
96+
['the root entry `index.ts`', '../index.ts', 'ColumnWidthConfig', 'CardTemplate'],
97+
['the zod entry `zod/index.zod.ts`', '../zod/index.zod.ts', 'ColumnWidthConfigSchema', 'CardTemplateSchema'],
98+
])('%s exports no retired name, and still exports its sibling', (_label, file, retired, sibling) => {
99+
const names = declaredAndExportedNames(resolve(HERE, file));
100+
expect(names).not.toContain(retired);
101+
expect(names).toContain(sibling); // lit control
102+
});
103+
});
104+
105+
/* ── tree-scoped: no source anywhere declares or exports either name ───── */
106+
107+
describe('no source under packages/, apps/ or examples/ declares or exports a retired name (objectui#10582)', () => {
108+
const SKIP = new Set(['node_modules', 'dist', 'build', 'coverage', '.turbo', '.next', 'out']);
109+
const walk = (dir: string): string[] =>
110+
readdirSync(dir).flatMap((name) => {
111+
if (SKIP.has(name)) return [];
112+
const p = join(dir, name);
113+
if (statSync(p).isDirectory()) return walk(p);
114+
return /\.(?:ts|tsx|mts|cts)$/.test(name) && !name.endsWith('.d.ts') ? [p] : [];
115+
});
116+
const sources = ['packages', 'apps', 'examples'].flatMap((d) => walk(resolve(ROOT, d)));
117+
118+
it('no declaration and no export specifier of either name, in any file', () => {
119+
const offenders = sources
120+
.filter((f) => f !== SELF && RETIRED_TOKEN.test(readFileSync(f, 'utf8')))
121+
.flatMap((f) =>
122+
declaredAndExportedNames(f)
123+
.filter((n) => (RETIRED as readonly string[]).includes(n))
124+
.map((n) => `${relative(ROOT, f)}: ${n}`),
125+
);
126+
expect(offenders).toEqual([]);
127+
});
128+
129+
it('the walk can see the corpus and the reader can find a live export (non-vacuity)', () => {
130+
const rel = new Set(sources.map((f) => relative(ROOT, f)));
131+
expect(rel.has('packages/plugin-kanban/src/types.ts')).toBe(true);
132+
expect(rel.has('packages/types/src/zod/complex.zod.ts')).toBe(true);
133+
// The same reader, on the files the retired names used to leave through,
134+
// still sees the sibling that did not retire.
135+
expect(declaredAndExportedNames(resolve(ROOT, 'packages/plugin-kanban/src/types.ts'))).toContain('CardTemplate');
136+
expect(declaredAndExportedNames(resolve(ROOT, 'packages/plugin-kanban/src/index.tsx'))).toContain('CardTemplate');
137+
expect(declaredAndExportedNames(resolve(ROOT, 'packages/types/src/zod/complex.zod.ts'))).toContain('CardTemplateSchema');
138+
});
139+
});

‎packages/types/src/__tests__/zod-mirror-parity.test.ts‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ import type { z } from 'zod';
677677

678678
import { AppActionSchema, AppComponentSchema, MenuItemSchema as AppMenuItemSchema, NavigationAreaSchema, NavigationItemSchema } from '../zod/app.zod.js';
679679
import { BaseSchema, ComponentConfigSchema, ComponentInputSchema, ComponentMetaSchema, KeyedI18nLabelSchema, SchemaNodeSchema } from '../zod/base.zod.js';
680-
import { CalendarEventSchema, CalendarViewSchema, CarouselItemSchema, CarouselSchema, ChatbotSchema, ChatbotEnhancedSchema, ChatbotFloatingSchema, ChatMessageSchema, ChatMessageSourceSchema, ChatToolInvocationSchema, DashboardComponentSchema, DashboardConfigSchema, DashboardWidgetConfigSchema, DashboardWidgetLayoutSchema, DashboardWidgetSchema, FilterBuilderSchema, FilterFieldSchema, KanbanCardSchema, KanbanColumnSchema, CardTemplateSchema, ColumnWidthConfigSchema, FilterBuilderConditionSchema, FilterGroupSchema } from '../zod/complex.zod.js';
680+
import { CalendarEventSchema, CalendarViewSchema, CarouselItemSchema, CarouselSchema, ChatbotSchema, ChatbotEnhancedSchema, ChatbotFloatingSchema, ChatMessageSchema, ChatMessageSourceSchema, ChatToolInvocationSchema, DashboardComponentSchema, DashboardConfigSchema, DashboardWidgetConfigSchema, DashboardWidgetLayoutSchema, DashboardWidgetSchema, FilterBuilderSchema, FilterFieldSchema, KanbanCardSchema, KanbanColumnSchema, CardTemplateSchema, FilterBuilderConditionSchema, FilterGroupSchema } from '../zod/complex.zod.js';
681681
import { ActionSchema, CRUDDialogSchema, DetailSchema } from '../zod/crud.zod.js';
682682
import { AlertSchema, AvatarSchema, BadgeSchema, BarChartSchema, ChartDataSeriesSchema, ChartSchema, DataTableSchema, DrillDownConfigSchema, HtmlSchema, KbdSchema, ListItemSchema, ListSchema, MarkdownSchema, StaticTableColumnSchema, StatisticSchema, TableColumnSchema, TableSchema, TimelineEventSchema, TimelineSchema, TreeNodeSchema, TreeViewSchema } from '../zod/data-display.zod.js';
683683
import { AccordionItemSchema, AccordionSchema, CollapsibleSchema, ToggleGroupItemSchema, ToggleGroupSchema } from '../zod/disclosure.zod.js';
@@ -692,7 +692,7 @@ import { DetailViewFieldSchema, DetailViewSchema, DetailViewSectionSchema, Detai
692692

693693
import type { AppAction as Ts_AppAction, AppComponentSchema as Ts_AppComponentSchema, NavigationArea as Ts_NavigationArea } from '../app';
694694
import type { BaseSchema as Ts_BaseSchema, ComponentConfig as Ts_ComponentConfig, ComponentInput as Ts_ComponentInput, ComponentMeta as Ts_ComponentMeta, KeyedI18nLabel as Ts_KeyedI18nLabel } from '../base';
695-
import type { CalendarEvent as Ts_CalendarEvent, CalendarViewSchema as Ts_CalendarViewSchema, CarouselItem as Ts_CarouselItem, CarouselSchema as Ts_CarouselSchema, ChatbotSchema as Ts_ChatbotSchema, ChatbotEnhancedSchema as Ts_ChatbotEnhancedSchema, ChatbotFloatingSchema as Ts_ChatbotFloatingSchema, ChatMessage as Ts_ChatMessage, ChatMessageSource as Ts_ChatMessageSource, ChatToolInvocation as Ts_ChatToolInvocation, DashboardComponentSchema as Ts_DashboardComponentSchema, DashboardWidgetLayout as Ts_DashboardWidgetLayout, DashboardWidgetSchema as Ts_DashboardWidgetSchema, FilterBuilderSchema as Ts_FilterBuilderSchema, FilterField as Ts_FilterField, KanbanCard as Ts_KanbanCard, KanbanColumn as Ts_KanbanColumn, CardTemplate as Ts_CardTemplate, ColumnWidthConfig as Ts_ColumnWidthConfig } from '../complex';
695+
import type { CalendarEvent as Ts_CalendarEvent, CalendarViewSchema as Ts_CalendarViewSchema, CarouselItem as Ts_CarouselItem, CarouselSchema as Ts_CarouselSchema, ChatbotSchema as Ts_ChatbotSchema, ChatbotEnhancedSchema as Ts_ChatbotEnhancedSchema, ChatbotFloatingSchema as Ts_ChatbotFloatingSchema, ChatMessage as Ts_ChatMessage, ChatMessageSource as Ts_ChatMessageSource, ChatToolInvocation as Ts_ChatToolInvocation, DashboardComponentSchema as Ts_DashboardComponentSchema, DashboardWidgetLayout as Ts_DashboardWidgetLayout, DashboardWidgetSchema as Ts_DashboardWidgetSchema, FilterBuilderSchema as Ts_FilterBuilderSchema, FilterField as Ts_FilterField, KanbanCard as Ts_KanbanCard, KanbanColumn as Ts_KanbanColumn, CardTemplate as Ts_CardTemplate } from '../complex';
696696
import type { DashboardConfig as Ts_DashboardConfig, DashboardWidgetConfig as Ts_DashboardWidgetConfig } from '../designer';
697697
import type { CRUDDialogSchema as Ts_CRUDDialogSchema, DetailSchema as Ts_DetailSchema } from '../crud';
698698
import type { AlertSchema as Ts_AlertSchema, AvatarSchema as Ts_AvatarSchema, BadgeSchema as Ts_BadgeSchema, BarChartSchema as Ts_BarChartSchema, ChartDataSeries as Ts_ChartDataSeries, ChartSchema as Ts_ChartSchema, DataTableSchema as Ts_DataTableSchema, DrillDownConfig as Ts_DrillDownConfig, HtmlSchema as Ts_HtmlSchema, KbdSchema as Ts_KbdSchema, ListItem as Ts_ListItem, ListSchema as Ts_ListSchema, MarkdownSchema as Ts_MarkdownSchema, StaticTableColumn as Ts_StaticTableColumn, StatisticSchema as Ts_StatisticSchema, TableColumn as Ts_TableColumn, TableSchema as Ts_TableSchema, TimelineEvent as Ts_TimelineEvent, TimelineSchema as Ts_TimelineSchema, TreeViewSchema as Ts_TreeViewSchema, BreadcrumbItem as Ts_BreadcrumbItem, BreadcrumbSchema as Ts_BreadcrumbSchema } from '../data-display';
@@ -1535,7 +1535,6 @@ const MIRRORS = {
15351535
'complex.zod.ts#KanbanCardSchema': KanbanCardSchema,
15361536
'complex.zod.ts#KanbanColumnSchema': KanbanColumnSchema,
15371537
'complex.zod.ts#CardTemplateSchema': CardTemplateSchema,
1538-
'complex.zod.ts#ColumnWidthConfigSchema': ColumnWidthConfigSchema,
15391538
'crud.zod.ts#CRUDDialogSchema': CRUDDialogSchema,
15401539
'crud.zod.ts#DetailSchema': DetailSchema,
15411540
'data-display.zod.ts#AlertSchema': AlertSchema,
@@ -1700,7 +1699,6 @@ interface Declared {
17001699
'complex.zod.ts#KanbanCardSchema': Ts_KanbanCard;
17011700
'complex.zod.ts#KanbanColumnSchema': Ts_KanbanColumn;
17021701
'complex.zod.ts#CardTemplateSchema': Ts_CardTemplate;
1703-
'complex.zod.ts#ColumnWidthConfigSchema': Ts_ColumnWidthConfig;
17041702
'crud.zod.ts#CRUDDialogSchema': Ts_CRUDDialogSchema;
17051703
'crud.zod.ts#DetailSchema': Ts_DetailSchema;
17061704
'data-display.zod.ts#AlertSchema': Ts_AlertSchema;
@@ -4224,7 +4222,7 @@ const ZOD_DIR = join(dirname(fileURLToPath(import.meta.url)), '..', 'zod');
42244222
* MINUEND under it had moved. Nothing failed on any of those days, because nothing
42254223
* compared the registry to a number. objectui#7433 is that absence, not the digits.
42264224
*/
4227-
const EXPECTED_MIRROR_PAIRS = 161;
4225+
const EXPECTED_MIRROR_PAIRS = 160;
42284226

42294227
/**
42304228
* A ledger this file can size from its own AST. `WiderThanDeclared` joined at

‎packages/types/src/complex.ts‎

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,12 @@ export interface KanbanColumn {
247247
* renders through the surviving spelling and this retirement moves zero stored
248248
* documents.
249249
*
250-
* {@link KanbanCard}, {@link KanbanColumn}, {@link CardTemplate} and
251-
* {@link ColumnWidthConfig} are NOT retired — the renderer and the
252-
* `CardTemplates` component still consume the first three. The one
253-
* `plugin-kanban` reader of {@link ColumnWidthConfig} was removed by
254-
* objectui#8522, whose ruling did not reach the type itself.
250+
* {@link KanbanCard}, {@link KanbanColumn} and {@link CardTemplate} are NOT
251+
* retired — the renderer and the `CardTemplates` component still consume
252+
* them. `ColumnWidthConfig`, which this arm also carried, lost its one
253+
* `plugin-kanban` reader to objectui#8522 and was then deleted, with its Zod
254+
* mirror, by objectui#10582 (pinned in
255+
* `./__tests__/column-width-config-retired-10582.test.ts`).
255256
*
256257
* Pinned in `./__tests__/bare-kanban-node-key-retired-8802.test.ts`.
257258
*/
@@ -270,20 +271,6 @@ export interface CardTemplate {
270271
values: Record<string, any>;
271272
}
272273

273-
/**
274-
* Configuration for custom column widths.
275-
*/
276-
export interface ColumnWidthConfig {
277-
/** Default column width in pixels */
278-
defaultWidth?: number;
279-
/** Minimum column width in pixels */
280-
minWidth?: number;
281-
/** Maximum column width in pixels */
282-
maxWidth?: number;
283-
/** Per-column width overrides keyed by column ID */
284-
overrides?: Record<string, number>;
285-
}
286-
287274
/**
288275
* Calendar view mode — the registered `calendar-view` renderer's rendered set.
289276
*

‎packages/types/src/index.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,6 @@ export type {
340340
// (objectui#8802, maintainer ruling 2026-09-09) — `ObjectKanbanSchema` below
341341
// is the surviving kanban face.
342342
CardTemplate,
343-
ColumnWidthConfig,
344343
CalendarViewMode,
345344
CalendarEvent,
346345
CalendarViewSchema,

‎packages/types/src/zod/complex.zod.ts‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,6 @@ export const CardTemplateSchema = z.object({
149149
values: z.record(z.string(), z.any()).describe('Pre-filled field values'),
150150
});
151151

152-
/**
153-
* Column Width Config Schema — mirrors {@link ColumnWidthConfig} in `../complex.ts`.
154-
*/
155-
export const ColumnWidthConfigSchema = z.object({
156-
defaultWidth: z.number().optional().describe('Default column width in pixels'),
157-
minWidth: z.number().optional().describe('Minimum column width in pixels'),
158-
maxWidth: z.number().optional().describe('Maximum column width in pixels'),
159-
overrides: z.record(z.string(), z.number()).optional().describe('Per-column width overrides keyed by column ID'),
160-
});
161-
162152
/**
163153
* ⛔ The `'kanban'` arm is RETIRED (objectui#8802, maintainer ruling 2026-09-09)
164154
* — this is its NAMED REFUSAL, the half a deletion would not have given.

‎packages/types/src/zod/index.zod.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,6 @@ export {
268268
KanbanCardSchema,
269269
KanbanColumnSchema,
270270
CardTemplateSchema,
271-
ColumnWidthConfigSchema,
272271
// ⛔ `KanbanSchema` RETIRED with the bare `kanban` node type key
273272
// (objectui#8802, maintainer ruling 2026-09-09). `RetiredKanbanNodeSchema`
274273
// takes its place inside `ComplexSchema` so an authored `type: "kanban"` is

0 commit comments

Comments
 (0)