Commit 48203ff
authored
spec(ui): retire ObjectKanbanProps.quickAdd from object-kanban — tombstone, D2 conversion and baselines (#17792)
Fixes #17260
Executes the objectui#8285 director-seat ruling (comment 5583979207,
decision batch #91, 2026-09-08, standing maintainer delegation) — ruled
**option B**: `quickAdd` is retired from the `object-kanban` board and
stays only on the `kanban-ui` block, where a React host can supply the
runtime function the control needs. This PR is the tombstone half that
ruling assigns to this repo. A vs B is not re-opened here.
- **Clause-②: yes** — this PR narrows a published accept set:
`ObjectKanbanProps.quickAdd` is retired from `object-kanban`.
## The premise, re-measured rather than relayed
The card's body said an author writing `quickAdd: true` got "nothing,
with no diagnostic". The filer corrected that themselves, and the
correction is what holds — re-measured here at the objectui sha this
repo pins (`.objectui-sha` = `53ded82bf`), not at that checkout's HEAD:
| probe at the pinned sha | reading | control (same instrument, same
file) |
|:--|--:|:--|
| `onQuickAdd` in `plugin-kanban/src/ObjectKanban.tsx` | **0** |
`onCardClick` — **6** |
| `quickAdd` in the same file | **0** | `objectName` — **38** |
| `object-kanban` registration `inputs` (`index.tsx:421-431`) |
`objectName`, `columns` — `quickAdd` absent | `objectName` present |
The board **forwards** the key — `ObjectKanban.tsx:931` spreads the
authored bag into `KanbanRenderer`, which passes
`quickAdd={schema.quickAdd}` alongside `onQuickAdd={schema.onQuickAdd}`
(`index.tsx:196`) — but `KanbanImpl` gates the affordance on **both**
(`:355`, `:368`), and `onQuickAdd` is a host-supplied function JSON
cannot carry and no producer puts on an `object-kanban` node. So the
gate was permanently false: accepted-and-dropped, exactly as the card
classifies it.
Two readings the card's numbers came from could **not** be reproduced at
the pin, and are reported as such rather than passed on:
`OBJECT_KANBAN_INPUTS` (the 13-key constant) and the `inert-quick-add`
interim diagnostic do not exist at `53ded82bf` at all — both are later
objectui work. `OBJECT_KANBAN_INPUTS` does resolve at that checkout's
HEAD (control lit, 3 files), and the registry-spec ledger records the
key verbatim there as `ESCALATED (object-kanban.quickAdd — measured NOT
honoured)`. The pin's own equivalent reading is the `inputs` row in the
table above, and it says the same thing.
## The retirement kit
| carrier | what changed |
|:--|:--|
| `ObjectKanbanPropsSchema.quickAdd` | `retiredKey()` tombstone — `tsc`
types it `never`, and a value reaching the parse raises the prescription
instead of a bare unknown-key verdict |
| the schema's docblock | it listed `quickAdd` among the keys reached
"via the forwarded schema" — true about the FORWARD, false about the
READ, which is how the key kept re-authorizing itself. Corrected in the
same stroke |
| `src/conversions/registry.ts` | D2 conversion
`object-kanban-quick-add-removed` — a pure lossless delete (the key
never had an effect to preserve), scoped by component `type` so the LIVE
`kanban-ui` spelling stays out of its reach |
|
`migrations/entries/retired-keys/18.ui__ObjectKanbanProps__quickAdd.ts`
| `RETIRED_KEYS_BY_MAJOR[18]` entry `ui/ObjectKanbanProps:quickAdd`,
plus the D3 chain-step wiring and rationale |
| `authorable-surface/ui.json` | the row becomes
`ui/ObjectKanbanProps:quickAdd [RETIRED]` |
| `content/docs/references/ui/component.mdx` | regenerated — the row now
prints the prescription |
| `src/ui/component.test.ts` | four pins (see the ablation below) |
| `.changeset/17260-object-kanban-quick-add-retired.md` | `minor`,
`adr-0087: registered object-kanban-quick-add-removed` |
`packages/spec/src/ui/view.zod.ts` is untouched — it is another round's
declared face this batch. The `kanban-ui` block's `quickAdd` is
untouched by design: it is not a component type this spec declares at
all, which is why the conversion is scoped by `type` rather than by key
name.
## Liveness — measured, with a lit control
Zero stored or example stacks in this repo carry `quickAdd`, because
**no `object-kanban` component is authored anywhere under `examples/` or
`apps/`**. The zero is a reading, not a dark probe: the same instrument
over the same corpora returns `object-grid` 3 and `object-metric` 8.
Repo-wide, `quickAdd` occurred in exactly four places before this PR —
the schema key, the docblock sentence, the ratchet row and the generated
docs row — i.e. only the carriers being retired here. Out-of-repo
authors are unknown and unknowable from here, which is what the D2
conversion and the prescription exist for.
## Verification
| run | result |
|:--|:--|
| `pnpm --filter @objectstack/spec build` | `VERDICT command-exit 0` |
| `pnpm --filter @objectstack/spec test` | `VERDICT command-exit 0` —
Test Files 473 passed (473), Tests 13443 passed (13443) |
| `pnpm --filter @objectstack/spec typecheck` | exit 0 |
| `pnpm --filter @objectstack/spec check:generated` | 15/15 artifacts
current (one lap: `gen:migration-registry`, then the build's
`gen:schema`, then `gen:docs`) |
| `pnpm --filter @objectstack/spec check:migration-registry` | `✓
src/migrations/registry.ts is current (202 semantic, 168 retired-key,
178 retired-def)` |
| `node scripts/check-adr-0087-registration.mjs --base origin/main` | `✓
1 declared-breaking changeset(s), each carrying an ADR-0087 disposition`
— `registered object-kanban-quick-add-removed (new here)` |
| `node scripts/check-changeset-no-major.mjs --base origin/main` | `✓
This diff introduces no major bump` |
| `pnpm check:nul-bytes` | OK — 8453 text files scanned |
The registry was regenerated by the repo's own generator (`pnpm --filter
@objectstack/spec gen:migration-registry` → `✓ wrote
src/migrations/registry.ts`), never by hand; the first build before that
run failed loudly with `1 key(s) were tombstoned with no registered
retirement`, which is the gate doing its job.
**Ablation — the pins can fail.** On `HEAD`: 4 passed. With the
tombstone mutated back to a live `z.boolean().optional()` in source
(mutation proven on disk: tombstone-call count 1 → 0, injected marker 1,
blob hash `106299e7…` → `e657a7e3…`), the same run goes **2 failed / 2
passed**: the two refusal pins are the discriminating half. Restored
from `HEAD` and proven byte-identical (blob back to `106299e7…`, `git
diff HEAD` empty). Reported honestly: the `not.toHaveProperty` pin does
**not** flip under that mutation — an optional key absent from the input
is not materialized either way — so it guards the strip direction and
not the refusal.
## Changeset — measured, not assumed
Owed, at `minor`.
- **Subject**: the tombstone's prescription text reaches the published
`dist` — 2 hits, `dist/ui/index.js` and `dist/ui/index.mjs`, both inside
`packages/spec`'s `files[]`.
- **Positive control**: a pre-existing shipped describe from the same
schema — 2 hits, same files.
- **Negative control**: text that exists only in `component.test.ts` —
**0** hits in `dist`.
Level is `minor`, not `major`: `scripts/check-changeset-no-major.mjs`
forbids `major` during the launch window (lockstep versioning would
promote ~70 packages), and the sibling retirement one entry over
(`ui/ObjectGridProps:defaultSort`, #11805) is registered under protocol
18 on the same reading. `api-surface/` is unchanged and correctly so —
it ratchets export existence, and `ObjectKanbanProps` still exists, one
key narrower.
## Not flipping this ready
An at-tier contract-review verdict is owed on the head that lands;
`needs:contract-review` rides this PR. Draft, not enqueued.
Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
_Generated by [Claude
Code](https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH)_
---
_Generated by [Claude Code](https://claude.ai/code)_1 parent 2070a1d commit 48203ff
8 files changed
Lines changed: 439 additions & 6 deletions
File tree
- .changeset
- content/docs/references/ui
- packages/spec
- authorable-surface
- src
- conversions
- migrations
- entries/retired-keys
- ui
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
502 | 502 | | |
503 | 503 | | |
504 | 504 | | |
505 | | - | |
| 505 | + | |
506 | 506 | | |
507 | 507 | | |
508 | 508 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
780 | 780 | | |
781 | 781 | | |
782 | 782 | | |
783 | | - | |
| 783 | + | |
784 | 784 | | |
785 | 785 | | |
786 | 786 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8010 | 8010 | | |
8011 | 8011 | | |
8012 | 8012 | | |
| 8013 | + | |
| 8014 | + | |
| 8015 | + | |
| 8016 | + | |
| 8017 | + | |
| 8018 | + | |
| 8019 | + | |
| 8020 | + | |
| 8021 | + | |
| 8022 | + | |
| 8023 | + | |
| 8024 | + | |
| 8025 | + | |
| 8026 | + | |
| 8027 | + | |
| 8028 | + | |
| 8029 | + | |
| 8030 | + | |
| 8031 | + | |
| 8032 | + | |
| 8033 | + | |
| 8034 | + | |
| 8035 | + | |
| 8036 | + | |
| 8037 | + | |
| 8038 | + | |
| 8039 | + | |
| 8040 | + | |
| 8041 | + | |
| 8042 | + | |
| 8043 | + | |
| 8044 | + | |
| 8045 | + | |
| 8046 | + | |
| 8047 | + | |
| 8048 | + | |
| 8049 | + | |
| 8050 | + | |
| 8051 | + | |
| 8052 | + | |
| 8053 | + | |
| 8054 | + | |
| 8055 | + | |
| 8056 | + | |
| 8057 | + | |
| 8058 | + | |
| 8059 | + | |
| 8060 | + | |
| 8061 | + | |
| 8062 | + | |
| 8063 | + | |
| 8064 | + | |
| 8065 | + | |
| 8066 | + | |
| 8067 | + | |
| 8068 | + | |
| 8069 | + | |
| 8070 | + | |
| 8071 | + | |
| 8072 | + | |
| 8073 | + | |
| 8074 | + | |
| 8075 | + | |
| 8076 | + | |
| 8077 | + | |
| 8078 | + | |
| 8079 | + | |
| 8080 | + | |
| 8081 | + | |
| 8082 | + | |
| 8083 | + | |
| 8084 | + | |
| 8085 | + | |
| 8086 | + | |
| 8087 | + | |
| 8088 | + | |
| 8089 | + | |
| 8090 | + | |
| 8091 | + | |
| 8092 | + | |
| 8093 | + | |
| 8094 | + | |
| 8095 | + | |
| 8096 | + | |
| 8097 | + | |
| 8098 | + | |
| 8099 | + | |
| 8100 | + | |
| 8101 | + | |
| 8102 | + | |
| 8103 | + | |
| 8104 | + | |
| 8105 | + | |
| 8106 | + | |
| 8107 | + | |
| 8108 | + | |
| 8109 | + | |
| 8110 | + | |
| 8111 | + | |
| 8112 | + | |
| 8113 | + | |
| 8114 | + | |
| 8115 | + | |
| 8116 | + | |
| 8117 | + | |
| 8118 | + | |
| 8119 | + | |
| 8120 | + | |
| 8121 | + | |
| 8122 | + | |
| 8123 | + | |
| 8124 | + | |
| 8125 | + | |
| 8126 | + | |
| 8127 | + | |
| 8128 | + | |
| 8129 | + | |
| 8130 | + | |
| 8131 | + | |
| 8132 | + | |
| 8133 | + | |
| 8134 | + | |
| 8135 | + | |
| 8136 | + | |
| 8137 | + | |
| 8138 | + | |
| 8139 | + | |
| 8140 | + | |
| 8141 | + | |
| 8142 | + | |
| 8143 | + | |
| 8144 | + | |
| 8145 | + | |
| 8146 | + | |
| 8147 | + | |
| 8148 | + | |
| 8149 | + | |
| 8150 | + | |
| 8151 | + | |
| 8152 | + | |
| 8153 | + | |
| 8154 | + | |
| 8155 | + | |
| 8156 | + | |
| 8157 | + | |
| 8158 | + | |
| 8159 | + | |
| 8160 | + | |
| 8161 | + | |
| 8162 | + | |
| 8163 | + | |
| 8164 | + | |
| 8165 | + | |
| 8166 | + | |
| 8167 | + | |
| 8168 | + | |
| 8169 | + | |
| 8170 | + | |
| 8171 | + | |
| 8172 | + | |
| 8173 | + | |
| 8174 | + | |
| 8175 | + | |
| 8176 | + | |
| 8177 | + | |
| 8178 | + | |
| 8179 | + | |
| 8180 | + | |
| 8181 | + | |
| 8182 | + | |
| 8183 | + | |
| 8184 | + | |
| 8185 | + | |
| 8186 | + | |
| 8187 | + | |
| 8188 | + | |
| 8189 | + | |
| 8190 | + | |
| 8191 | + | |
| 8192 | + | |
| 8193 | + | |
| 8194 | + | |
| 8195 | + | |
8013 | 8196 | | |
8014 | 8197 | | |
8015 | 8198 | | |
| |||
9170 | 9353 | | |
9171 | 9354 | | |
9172 | 9355 | | |
| 9356 | + | |
9173 | 9357 | | |
9174 | 9358 | | |
9175 | 9359 | | |
| |||
Lines changed: 30 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
0 commit comments