@object-ui/plugin-gantt 17.5.0 → 17.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,3264 @@
1
1
  # @object-ui/plugin-gantt
2
2
 
3
+ ## 17.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - af243c1: On `tree` and `chart` list views, the toolbar's Filter control and the `UserFilters`
8
+ chips now narrow the view, and on a `gantt` list view the toolbar's Search box now
9
+ narrows the chart (objectui#10250).
10
+
11
+ These three views run their own query instead of drawing the rows `ListView` fetched.
12
+ The tree and chart nodes carried only the authored `filter`, and the gantt node carried
13
+ no search term, so each control changed `ListView`'s own fetch and nothing on screen.
14
+
15
+ - The `tree` node and the object-bound `chart` node now carry the same effective filter
16
+ `ListView`'s own fetch sends, as the `gantt` node has since objectui#10037. The value
17
+ keeps its identity while its content is unchanged, so re-rendering the list does not
18
+ re-query the view.
19
+ - `ObjectGanttSchema` declares two optional keys, `search` and `searchableFields`.
20
+ `ObjectGantt` sends `search` as `$search` and, only alongside a term,
21
+ `searchableFields` as `$searchFields` — the pair a list's own query sends. A `gantt`
22
+ list view writes both from its toolbar Search box and the view's `searchableFields`.
23
+
24
+ Unchanged: the toolbar state still does not reach the query of a `chart` view bound to a
25
+ semantic `dataset`, and the toolbar Search box still does not reach the `tree` or `chart`
26
+ query. objectui#10326 stops offering that Search box on `tree` and `chart` views.
27
+ - 8673402: feat(plugin-gantt): `object-gantt` publishes the eleven `@objectstack/spec` row keys its renderer honours (objectui#11168 slice 4)
28
+
29
+ The `object-gantt` registration now declares `navigation`, `label`, `skipWeekends`, `holidays`, `persistLayout`, `viewName`, `markers`, `criticalPath`, `showBaselines`, `readOnly` and `mobileReadOnly`. Each is a member of the spec's `ComponentPropsMap['object-gantt']` row, and each was measured through the real `SchemaRenderer`, `ObjectGantt` and `GanttView` before it was declared (objectui#11111 decision 3 = B). All eleven are honoured, so the page validator no longer reports any of them as an unknown prop. Where the row's own describe is true of this renderer, the input's description starts with it word for word, followed by what the measurement added:
30
+
31
+ - `navigation`: absent opens the task's record in a drawer; `drawer`, `modal` and `popover` open that overlay; `split` opens the record beside the chart; `page` and a block without `mode` open the record page in the same tab, and `new_window` in a new tab; `none` and `preventNavigation` open nothing; `openNewTab` outranks every mode except `none`; `size` sets the overlay width. The gantt derives the record-page address from the page it is on and does not use a record navigator the host publishes, so a host that publishes one changes nothing. On the object's own list or view route that address is the record page; on any other page, such as a custom page, `/OBJECT/record/ID` is appended to the current address. On inline rows that name no object, no mode opens anything.
32
+ - `label`: a string, or an inline locale map resolved to the display locale, naming the exported PNG/PDF file after `gantt.exportFileName` and before the object's own label.
33
+ - `skipWeekends` and `holidays` (members: `yyyy-mm-dd` strings): working-day auto-schedule math, and the day view folds those days out of its axis. A non-empty `holidays` turns the working calendar on by itself.
34
+ - `persistLayout` and `viewName`: the `objectName:viewName` storage key; `persistLayout: false` removes the save-layout button and stores nothing.
35
+ - `markers`, `criticalPath`, `showBaselines` and `readOnly`.
36
+ - `mobileReadOnly`: on a chart narrower than 640px the chart's write paths are read-only unless `false`; the record drawer locks under `readOnly` alone, so a task's record still opens writable on a narrow chart.
37
+
38
+ The `gantt` input's description no longer names `percentageField`, which nothing reads and the spec refuses by name. It now starts with the row's own describe and states the three required members.
39
+
40
+ Nothing changes at render time: every key was already read. The README and the docs page say what each key does, including the record-page address above. The README no longer lists `{ provider: 'schema', schemaId }` as a source this chart reads: measured, a gantt carrying it queries `objectName` instead.
41
+ - 00f3eb5: `ObjectGanttSchema` declares the ten gantt keys `ObjectGantt` actually reads
42
+ (objectui#5903, triage 2026-08-24). Every one is a real, working, documented
43
+ feature — `readOnly`, `mobileReadOnly`, `markers`, `navigation`, `skipWeekends`,
44
+ `holidays`, `criticalPath`, `showBaselines`, `persistLayout`, `viewName` — and
45
+ none of them was discoverable from the published type, because all ten were read
46
+ as `(schema as any).K`. The cast was the load-bearing part: it kept the read
47
+ invisible to `tsc`, to the zod mirror and to the designer's registry `inputs`.
48
+
49
+ Both halves move together. The TS declaration (`packages/types/src/objectql.ts`)
50
+ and its zod mirror (`src/zod/objectql.zod.ts`) gain the same ten keys at the same
51
+ requiredness — all optional — and no `KnownDrift` entry is added. `navigation` is
52
+ taken from `@objectstack/spec`'s `NavigationConfigSchema` by reference rather than
53
+ restated, matching `ObjectGridSchema.navigation`.
54
+
55
+ ⚠️ **The JUSTIFICATION for that parity clause was retired (objectui#9743); the
56
+ clause itself stands and did not move.** As first written it credited the
57
+ `zod-mirror-parity` ratchet with a zero-drift reading for this pair — but at that
58
+ time the ratchet measured three directions and was structurally blind to the
59
+ MIRRORED-but-undeclared one (objectui#9711), so a zero from it recorded that it
60
+ had not looked in that direction, not that nothing was there. objectui#9725
61
+ landed the fourth direction, and it covers this pair BY NAME:
62
+ `packages/types/src/__tests__/zod-mirror-parity.test.ts` registers
63
+ `objectql.zod.ts#ObjectGanttSchema` in both its mirror map and its declaration
64
+ map; `assertionMirroredUndeclaredMatchesLedger` requires every registered pair's
65
+ mirrored-but-undeclared key set to equal that pair's `MirroredUndeclared` ledger
66
+ entry — `never` for a pair the ledger does not name — and
67
+ `assertionNoVacuousMirroredUndeclaredMeasurement` refuses a measurement that has
68
+ degenerated to `any`. ⛔ Read this pair's verdict off that reconciliation, which
69
+ re-derives it on every run, rather than off any figure written here; when this
70
+ paragraph was authored, on 2026-09-18, it required no `MirroredUndeclared` entry
71
+ for the pair.
72
+
73
+ `ObjectGanttProps.schema` is retyped from `ObjectGridSchema` to
74
+ `ObjectGanttSchema`. That is what makes the declaration load-bearing: the ten
75
+ keys are not grid keys, so with the old prop type, dropping the casts would have
76
+ left the reads landing on `BaseSchema`'s index signature — the same invisibility
77
+ in different syntax. The grid-style `{ gantt: { … } }` block is unaffected;
78
+ `getGanttConfig` reads it through that index signature exactly as before, and the
79
+ registered renderer passes `schema: any`, so no runtime shape is turned away.
80
+
81
+ Accept-set change, stated plainly: a **declared** key is now type-validated, so
82
+ `readOnly: 'yes'` is refused where it used to parse green — the same narrowing
83
+ objectui#5074 landed for `viewMode`. An **undeclared** key is still accepted:
84
+ `BaseSchema` is `.passthrough()` and carries an index signature (objectui#5155's
85
+ structural ceiling), so declaring these ten did not buy rejection of a
86
+ misspelling. `packages/types/src/__tests__/gantt-declared-keys.test.ts` pins both
87
+ halves so neither can be misread.
88
+
89
+ The eleventh reported key, `label`, needed no declaration — `BaseSchema` already
90
+ carries it — so only its cast was dropped.
91
+ - 75bd83d: `ObjectGanttSchema` declares the flattened `GanttConfig` face `ObjectGantt`
92
+ actually reads (objectui#6051). `getGanttConfig` has two branches: when
93
+ `startDateField` and `endDateField` are both present at the TOP level it builds
94
+ its config from top-level keys and returns early; otherwise it reads the `gantt`
95
+ block. Everything the first branch reads was undeclared — and unlike
96
+ objectui#5903's ten, none of it was hidden behind a cast. `BaseSchema` carries
97
+ `[key: string]: any` (objectui#5155's structural ceiling) and the helper's
98
+ parameter was `ObjectGridSchema | any`, so `schema.colorField` type-checked as
99
+ `any` with no syntax anywhere to grep for. That is also why the census here is an
100
+ AST enumeration and not a compile-and-observe: an index signature absorbs every
101
+ literal name, so annotating the parameter compiles clean while enforcing nothing.
102
+
103
+ **27 keys join the declared surface, each additive and each with a live read
104
+ site.** 24 flattened `GanttConfig` members — `colorField`, `borderColorField`,
105
+ `dependenciesField`, `parentField`, `typeField`, `lockField`, `objectField`,
106
+ `summaryExtent`, `defaultCollapsedDepth`, `tooltipFields`, `baselineStartField`,
107
+ `baselineEndField`, `groupByField`, `resourceView`, `assigneeField`,
108
+ `effortField`, `capacity`, `quickFilters`, `autoZoomToFilter`, `timeSegments`,
109
+ `interactions`, `exportFileName`, `timeZone`, `dependencyTypes` — plus the three
110
+ query keys the fetch path reads, `staticData`, `filter` and `sort`. Nothing is
111
+ declared that the renderer does not consume.
112
+
113
+ **`GanttConfig` itself gains nine members and is a published type**, exported by
114
+ name from `packages/types/src/index.ts`: `lockField`, `objectField`,
115
+ `summaryExtent`, `defaultCollapsedDepth`, `borderColorField`, `dependencyTypes`,
116
+ `timeZone`, `exportFileName`, `interactions`. The entry file's diff is empty only
117
+ because the export list already named the type — the widening happened at the
118
+ declaration.
119
+
120
+ **The 28th measured key, `gantt` (the block face), is deliberately NOT declared**
121
+ — see the closing section.
122
+
123
+ The 24 are DERIVED from `GanttConfig` rather than restated, so the flat spelling
124
+ cannot fork from the block spelling, and the invariant is pinned in the type
125
+ system: every key of `GanttConfig` must be declared at the node's top level.
126
+ Making that derivation possible moved nine members — `lockField`, `objectField`,
127
+ `summaryExtent`, `defaultCollapsedDepth`, `borderColorField`, `dependencyTypes`,
128
+ `timeZone`, `exportFileName`, `interactions` — out of `plugin-gantt`'s
129
+ package-private `GanttConfigEx` and into `@object-ui/types`' `GanttConfig`. They
130
+ are a MOVE, not new vocabulary: the `gantt` block already honoured all nine, and
131
+ a type private to the plugin could be referenced by neither authoring face.
132
+
133
+ Both halves move together, as in objectui#5903: the TS declaration and its zod
134
+ mirror gain the same 27 keys at the same requiredness (all optional), the
135
+ spec-modelled ones taken from `GanttConfigSchema.shape` by reference, and no
136
+ `KnownDrift` or `UnmirroredDeclared` entry is added. The mirror builds the flat
137
+ face and the `gantt` block from one field map, so they are one schema expressed
138
+ twice.
139
+
140
+ ⚠️ **The JUSTIFICATION for that parity clause was retired (objectui#9743) — the
141
+ same retirement objectui#5903's entry carries, for the same clause and the same
142
+ reason; the clause itself stands and did not move.** As first written it credited
143
+ the `zod-mirror-parity` ratchet with a zero-drift reading for this pair, at a time
144
+ when that ratchet measured three directions and was structurally blind to the
145
+ MIRRORED-but-undeclared one (objectui#9711), so a zero from it recorded that it
146
+ had not looked in that direction. objectui#9725 landed the fourth direction, and
147
+ it covers this pair BY NAME:
148
+ `packages/types/src/__tests__/zod-mirror-parity.test.ts` registers
149
+ `objectql.zod.ts#ObjectGanttSchema` in both its mirror map and its declaration
150
+ map; `assertionMirroredUndeclaredMatchesLedger` reconciles every registered pair's
151
+ mirrored-but-undeclared key set against that pair's `MirroredUndeclared` ledger
152
+ entry — `never` for a pair the ledger does not name — and
153
+ `assertionNoVacuousMirroredUndeclaredMeasurement` refuses a measurement that has
154
+ degenerated to `any`. ⛔ Read this pair's verdict off that reconciliation, which
155
+ re-derives it on every run, rather than off any figure written here; when this
156
+ paragraph was authored, on 2026-09-18, it required no `MirroredUndeclared` entry
157
+ for the pair.
158
+
159
+ Accept-set change, stated plainly. All 27 keys are additive — every one is
160
+ optional, and nothing previously legal loses its slot. What changes is that a
161
+ **declared** key is now type-validated, so `capacity: 'one'` and
162
+ `summaryExtent: 'parent'` are refused where they used to parse green. An
163
+ **undeclared** key is still accepted — `BaseSchema` is `.passthrough()`, so this
164
+ bought no rejection of misspellings. There is no narrowing anywhere in this
165
+ change.
166
+
167
+ **`gantt` is severed on purpose (objectui#6475), not overlooked.** It is the 28th
168
+ key of the measured residue and a genuine read — `getGanttConfig`'s second branch
169
+ honours it in full — but it is the one key whose declaration would NOT have been
170
+ additive. It has no mirror entry today, so a block rides through `.passthrough()`
171
+ unvalidated; declaring it as `GanttConfig` means it gets parsed against the spec's
172
+ `GanttConfigSchema`, which REQUIRES `startDateField`, `endDateField` and
173
+ `titleField`, and `ObjectGanttSchema` reaches the CLI's `validate` / `check`
174
+ through `AnyComponentSchema`. A published CLI's refusal behaviour is decided on
175
+ its own card, where reviewers can see what they are approving; objectui#6475
176
+ carries the full measurement, including the case FOR enforcing it (the renderer
177
+ already feeds that block to `GanttConfigSchema.safeParse` and warns, so enforcing
178
+ restores declared = enforced rather than inventing a contract). Today's behaviour
179
+ is pinned in the test file so the omission is a measured state, not a silent gap.
180
+ `packages/types/src/__tests__/gantt-flat-config-declared-keys.test.ts` pins both
181
+ halves so neither can be misread.
182
+
183
+ Which face WINS is unchanged and was not decided here: the flat branch is checked
184
+ first and returns early, so a node carrying both spellings still renders the flat
185
+ one. (`plugin-map` had the opposite precedence ruled on in objectui#5018; no
186
+ equivalent ruling exists for gantt.)
187
+ - d7acad6: **plugin-gantt: the `gantt` block now outranks the flat top-level spelling, and
188
+ the losing face's keys are named instead of dropped.**
189
+
190
+ `getGanttConfig` checked the flattened top-level spelling first and returned
191
+ early, so a node carrying both spellings rendered the flat one and every key
192
+ inside an authored `gantt` block was discarded with **no diagnostic** — not even
193
+ the `GanttConfigSchema.safeParse` warning, which sat behind that early return.
194
+
195
+ `plugin-map` had the identical two-faces shape ruled the other way (maintainer
196
+ ruling on objectui#5018, 2026-08-17, landed in PR #5156): the block wins, with a
197
+ dev-mode warning naming the ignored top-level keys. objectui#6469 inherits that
198
+ ruling, so the two sibling view plugins now answer the same question the same
199
+ way.
200
+
201
+ What changes:
202
+
203
+ - A node carrying **both** spellings now renders the **`gantt` block's** values.
204
+ The block is taken **whole** — the flat keys are not merged into it.
205
+ - In dev, `[ObjectGantt] … these top-level keys are IGNORED: …` names every
206
+ shadowed flat key, once per distinct shadowing.
207
+ - Nothing else moves. A node with only the flat spelling, or only a block, is
208
+ read exactly as before.
209
+
210
+ **Producer-safe:** `ObjectView` (`case 'gantt'`) and `ListView` (`case 'gantt'`)
211
+ both flatten `options.gantt` onto top-level keys and emit **no** `gantt` key, so
212
+ every gantt reached through either view layer still takes the flat branch, and
213
+ the new warning cannot fire on that path. This is the same producer check the
214
+ `plugin-map` flip pinned, re-run on today's `main`.
215
+
216
+ This **supersedes** the precedence sentence in the objectui#6051 changeset
217
+ (`.changeset/6051-gantt-flat-config-declared-keys.md`), which recorded the flat
218
+ branch winning — accurate for that change, which deliberately did not touch
219
+ precedence, and reversed by this one.
220
+ - e3d117a: `ObjectGantt` and `ObjectTree` resolve a relationship target only from the two
221
+ spellings a contract carries, dropping the third one no contract declares
222
+ (objectui#6837, second slice).
223
+
224
+ - `ObjectGantt`'s quick-filter option fetch was
225
+ `fd?.reference_to ?? fd?.reference ?? fd?.referenceTo`; it is now
226
+ `fd?.reference_to ?? fd?.reference`.
227
+ - `ObjectTree`'s `detectParentField` was
228
+ `def?.reference || def?.reference_to || def?.referenceTo`; it is now
229
+ `def?.reference || def?.reference_to`.
230
+
231
+ **Accept-set move — a def carrying ONLY `referenceTo` stops resolving a target
232
+ at these two seams.** Concretely: the gantt quick filter for that field falls
233
+ back to the distinct values present in the loaded rows instead of fetching the
234
+ referenced object's full domain, and the tree stops auto-detecting that field as
235
+ its parent pointer, so records render as a flat forest unless `parentField` is
236
+ configured explicitly. Nothing else changes; the two surviving arms are
237
+ untouched.
238
+
239
+ Two things bound that move:
240
+
241
+ - Any def that entered through the ingestion choke point is unaffected.
242
+ `normalizeSchemaReferenceKeys` reads `reference_to ?? reference ??
243
+ referenceTo` and stamps both snake_case keys, so a `referenceTo`-only def
244
+ arriving via `MetadataProvider` or `ObjectStackAdapter.getObjectSchema`
245
+ already carries `reference_to` before either component sees it. Only a def
246
+ that bypassed that door entirely is affected — and that door is not total:
247
+ `getObjectSchema` is a required member of the published `DataSource`
248
+ interface, and both components call it on the generic `dataSource`.
249
+ - No contract declares the deleted spelling. `@objectstack/spec` 17.2.0's
250
+ `FieldSchema` refuses `referenceTo` by name with `unrecognized_keys`, carrying
251
+ its own "Did you mean `referenceTo` -> `reference`?" rename, and `referenceTo`
252
+ is additionally a tombstone in `RETIRED_FIELD_KEY_TOMBSTONES` (objectui#6041)
253
+ at all three strip sites, so the designer read door removes it before a draft
254
+ round-trips.
255
+
256
+ A repo-wide structure-walk producer census found **0** emitters of `referenceTo`
257
+ reaching either seam, measured in the cell these components read (a value inside
258
+ an object schema's `fields` container) against controls `reference` (92 hits / 36
259
+ files) and `reference_to` (52 / 36) hot in the same pass over the same cells;
260
+ the only two in-cell hits are negative fixtures of the retirement machinery,
261
+ asserting the read door strips the key. Neither `plugin-gantt` nor `plugin-tree`
262
+ emits `referenceTo` anywhere, while both packages' own fixtures are hot on the
263
+ surviving spellings.
264
+
265
+ Pinned by `ObjectGantt.referenceArms-6837.test.tsx` and
266
+ `ObjectTree.referenceArms-6837.test.tsx`, which keep the live arms green beside a
267
+ named refusal for the deleted key.
268
+
269
+ ⚠️ **Dated note, 2026-09-30 — the choke point folds, it no longer stamps both keys — objectui#11070.** "`normalizeSchemaReferenceKeys` ... stamps both snake_case keys" above held when this change landed. Later in this same release objectui#11070 (round 4) made that pass fold a legacy spelling onto `reference` without stamping `reference_to`; a def that entered through it still carries `reference`, the one arm both components keep. `.changeset/11070-reference-to-round4.md` states what ships; the text above is kept as the reading of this change.
270
+ - 045d20b: Relationship-target readers resolve a lookup's target from `reference` alone,
271
+ dropping the `reference_to` fallback arm (objectui#6837, half 2).
272
+
273
+ Maintainer ruling, 2026-08-31, 原文照录: 「objectui不是前端的项目吗?后端的元数据只要
274
+ 对,前端按协议执行就行了呀」. Protocol normalization belongs on the SERVER; the front
275
+ end just executes the protocol. objectstack#13847 landed the server half — a
276
+ `field-reference-to-alias` conversion rewrites stored `reference_to` to
277
+ `reference` on the serve path and in `os migrate meta`.
278
+
279
+ `reference` is the only target spelling `@objectstack/spec`'s `FieldSchema`
280
+ declares. Measured on the installed 17.2.0: it refuses `reference_to`,
281
+ `referenceTo` and `target` with `unrecognized_keys`, each carrying its own
282
+ "Did you mean -> `reference`?" rename, while a nonsense key gets the same
283
+ refusal with NO rename hint and `reference` parses clean.
284
+
285
+ ## ⚠️ BREAKING for a hand-written schema that spells `reference_to` — read this
286
+
287
+ **This is a behaviour change for BYO consumers, and it is being stated rather
288
+ than shipped silently.** ObjectUI is usable without an ObjectStack backend
289
+ (`examples/byo-backend-console`), and a hand-written TypeScript schema passes
290
+ through no zod door, so nothing rejects the legacy spelling at authoring time.
291
+
292
+ **The break surface is narrower than "all BYO consumers", and this is the
293
+ measurement rather than a blanket claim.** Two ingestion choke points stamp both
294
+ snake_case keys from whichever spelling arrived — `MetadataProvider`'s type
295
+ cache for metadata type `object`, and `ObjectStackAdapter.getObjectSchema`. Any
296
+ def that passed either one already carries `reference` and is **completely
297
+ unaffected**. What is affected is exactly:
298
+
299
+ - **A `DataSource` implementation other than `ObjectStackAdapter`.**
300
+ `getObjectSchema` is a required member of the published `DataSource`
301
+ interface, and the readers call it on the generic `dataSource` (through
302
+ `useSettledSchema` and directly), so a host adapter's object schema reaches
303
+ them raw. Every in-repo example of one is on this path:
304
+ `ApiDataSource`, `ValueDataSource`, `packages/types/examples/rest-data-source.ts`,
305
+ `examples/byo-backend-console/src/mockDataSource.ts`,
306
+ `packages/runner/src/lib/mockDataSource.ts`,
307
+ `apps/site/app/components/galleryDataSource.ts`,
308
+ `apps/console/src/sdui-workbench-preview.tsx`,
309
+ `packages/plugin-grid/demo/bulk-actions.tsx`.
310
+
311
+ **Measured on this tree, none of those eight emits a relationship target at all** —
312
+ `reference_to` and `reference` are both zero in each, and
313
+ `examples/byo-backend-console` carries no lookup or master_detail field
314
+ anywhere (its only `reference` hits are a vite triple-slash directive and a
315
+ tsconfig `references` array). The single in-repo producer that WAS on this
316
+ surface, `packages/plugin-gantt/demo/main.tsx`, is fixed here at the producer.
317
+
318
+ ⇒ **If you author object metadata by hand and spell a lookup's target
319
+ `reference_to`, rename that key to `reference`.** Symptom if you do not: the
320
+ target silently fails to resolve, and the affected surface degrades rather than
321
+ erroring — a related list is not derived, a gantt quick filter falls back to the
322
+ distinct values in the loaded rows instead of the referenced object's full
323
+ domain, a tree stops auto-detecting its parent pointer, a lookup cell shows a
324
+ raw id, a chart's group-by labels stay unresolved.
325
+
326
+ The ingestion choke point now emits a **dev-mode warning** when a def arrives
327
+ carrying only `reference_to` or `referenceTo` and no `reference`. It names the
328
+ object, the field and the offending key, and points at this ruling. Stamping is
329
+ deliberately unchanged, so nothing that worked stops working. It is memoised
330
+ once per **(object name, field name, spelling, target value)** — every segment
331
+ of that key is pinned, in both directions, in
332
+ `reference-keys.legacyWarning-6837.test.ts`.
333
+
334
+ ⛔ **This warning does NOT cover the break described above, and it is worth being
335
+ exact about that rather than letting it read as mitigation.** It lives in
336
+ `normalizeFieldReferenceKeys`, reachable only through
337
+ `normalizeSchemaReferenceKeys`, which has exactly two production call sites —
338
+ `MetadataProvider` (metadata type `object`) and
339
+ `ObjectStackAdapter.getObjectSchema`. Both of those also STAMP the def, so the
340
+ warning fires precisely where the def still resolves and nothing is broken. A
341
+ hand-written schema served through any OTHER `DataSource` — the break surface —
342
+ reaches a reader raw: it never passes through this code and produces **no
343
+ warning at all**. On that path the failure is exactly as silent as before.
344
+ A reader-side or shared-resolver diagnostic, which would cover it, remains open
345
+ on objectui#6837.
346
+
347
+ ⚠️ **Dated note, 2026-09-29 — the call-site count above has since moved —
348
+ objectui#7650.** "exactly two production call sites" above held when this change landed
349
+ (`045d20ba8`). Later in this same release objectui#7650 (PR objectui#8868) added a call
350
+ on `MetadataProvider`'s by-name object-schema serve path. Re-measured for objectui#10979
351
+ on `main` at `2eaf5be27`, `normalizeSchemaReferenceKeys` had three production call sites:
352
+ two in `MetadataProvider`, on its list path and on its by-name path, and one in
353
+ `ObjectStackAdapter.getObjectSchema`.
354
+ `.changeset/7650-metadata-item-reference-canonicalisation.md` (PR objectui#8868) states
355
+ what ships; the text above is kept as the reading of this change.
356
+
357
+ ## What did NOT change
358
+
359
+ **Every key these readers EMIT is byte-identical**, and that was verified
360
+ mechanically over the whole diff rather than asserted. Eleven of the sixteen
361
+ sites write a target onto a bag whose own contract spells it `reference_to` (or
362
+ camelCase `referenceTo`): the six whose read and write share a line —
363
+ `RecordDetailDrawer`, `RelatedList`, `buildDefaultPageSchema`, `ListView`,
364
+ `FilterConditionField`, `resolveActionParams` — plus five more that read on one
365
+ line and emit on another, and so are just as much emitters: `RecordDetailView`,
366
+ `RecordMetaFooter`, `ObjectGallery`, `fieldEnrichment` (all `reference_to`) and
367
+ `UserFilters` (`referenceTo`). Only the right-hand read narrowed anywhere; the
368
+ emitted key is what its target contract declares, and renaming it would be a
369
+ separate change.
370
+
371
+ **Three readers were deliberately left alone.** `LookupCellRenderer`
372
+ (`fields/src/index.tsx`), `LookupField` and `UserField` read `FieldMetadata` —
373
+ ObjectUI's OWN contract, whose `LookupFieldMetadata` declares `reference_to` and
374
+ never declares `reference`. They are fed by the emitters above and by published
375
+ example schemas (`examples/schema-catalog/src/schemas/fields-lookup/*.json`), so
376
+ narrowing them would break in-repo producers, and `plugin-grid`'s
377
+ `relationalMetaCopySet.derivation.test.ts` re-derives its read set from exactly
378
+ those three sources — where `reference_to` is recorded with verdict
379
+ `adapter-stamped`. `DetailViewFieldSchema` is likewise untouched.
380
+
381
+ ⚠️ **Dated note, 2026-09-30 — the stamp, the three readers and the emitted key have since moved — objectui#11070.** Later in this same release objectui#11070 (round 4) retired `reference_to` inside ObjectUI as well. `normalizeFieldReferenceKeys` now FOLDS a legacy `reference_to` / `referenceTo` onto `reference` and no longer stamps `reference_to`, so "Stamping is deliberately unchanged" and "stamp both snake_case keys" above no longer describe what ships. `LookupCellRenderer`, `LookupField` and `UserField` read `reference` only; `LookupFieldMetadata`, `MasterDetailFieldMetadata` and `DetailViewField` (with `DetailViewFieldSchema`) declare `reference`; and the emitters listed under "What did NOT change" write `reference`. A hand-written schema served through a `DataSource` other than `ObjectStackAdapter` that spells only `reference_to` therefore also loses the lookup picker's target and the read cell's name. `.changeset/11070-reference-to-round4.md` states what ships; the text above is kept as the reading of this change.
382
+ - bf244f4: Size the gantt task list from its container, and give a row's dates ONE predicate
383
+ (objectui#7204, objectui#7224; maintainer ruling 2026-09-02, option Y).
384
+
385
+ **A row could show no dates at all.** Two gates decided whether a row's dates were
386
+ painted, and they read two different widths. The Start/End columns were gated on the
387
+ container-derived task-list width; the `8/26 → 9/2` sublabel under the title was gated
388
+ by the component's own `@media (min-width: 640px) { .gantt-sm-hidden { display: none } }`
389
+ rule, which reads the viewport. Between a 640px and a 1023px container both were shut,
390
+ so the row's dates existed in the DOM twice and were painted zero times. The same hole
391
+ opened at any width once the splitter was dragged under the threshold.
392
+
393
+ The sublabel now renders on exactly the complement of the Start/End columns, both from
394
+ the same container-derived width, and the media rule is gone. A row always carries its
395
+ dates one way or the other.
396
+
397
+ **And the task list no longer caps at 320px.** From a 1024px container up, the pane
398
+ takes 3/8 of the container clamped to `[320, 560]` instead of a flat 320. At 1440 that
399
+ is 540px, which leaves the title 287px with the Start/End columns still painted — a
400
+ 40-character title measures 262px in the row's font, so real-world task names stop
401
+ truncating to about seven characters while several hundred pixels of chart sit empty.
402
+ Measured in Chromium at a 1440px container: title 53px before, 287px after.
403
+
404
+ The Start/End threshold moves from an estimated 280 to a derived **412** — 32 row
405
+ padding + 160 for the two columns + 28 for the open-details slot + 32 of title
406
+ furniture + 160 minimum title, each term traced to the markup that spends it. Below it
407
+ the sublabel carries the dates. One consequence worth stating: between a 1024px and a
408
+ 1097px container the columns are now off and the dates ride the sublabel, which trades
409
+ two 80px date cells for a title that grows from 67px to 291px.
410
+
411
+ Not fixed here, and unchanged: a row's `depth * 14` indent is unbounded, so no single
412
+ default keeps a deeply nested row legible.
413
+ - 7c3df8f: A non-grid view's fetch now carries a platform row ceiling, and crossing it is
414
+ never silent (objectui#7210, maintainer ruling a′, 2026-09-02).
415
+
416
+ Before this, `ObjectGantt`, `ObjectCalendar`, `ObjectMap` and `ObjectTree` each
417
+ issued a `find` with **no `$top` at all**, so the request returned the entire
418
+ filtered result set. At the 186 rows the card was filed from that is invisible;
419
+ on an object with 100k scheduled rows it is the whole table into the browser,
420
+ and nothing an author could write — `pagination.pageSize` included — could
421
+ bound a request that never carried a cap to begin with.
422
+
423
+ **What changed.** Those four fetches now ask for `NON_GRID_ROW_CEILING_TOP`
424
+ rows, draw at most `NON_GRID_ROW_CEILING` of them, and when the result set was
425
+ larger they render a footnote naming both numbers, verbatim as it renders:
426
+ *"Showing the first 2000 of 41234 records. Narrow the filter."* Below the
427
+ ceiling nothing changes: the full set draws and no footnote appears.
428
+
429
+ The four view packages take a **minor**, not a patch: a result set above the
430
+ ceiling is no longer drawn in full, which is a behaviour break whatever the
431
+ fixed group does to the released version number.
432
+
433
+ **The ceiling is a platform constant, not an authorable key** — `2000`, exported
434
+ from `@object-ui/react` as `NON_GRID_ROW_CEILING`. An authored `limit` or
435
+ `dataSource: { limit }` still does not reach these queries, by the same ruling;
436
+ three alternatives were rejected with it (a documentation note only — still the
437
+ whole table; truncating at `pageSize` — silent, and a complete schedule capped
438
+ at one page; an authorable `maxRows` — a new permanent key every author sets).
439
+
440
+ **Why 2,000.** One constant for all four, so the binding view sets it. Measured
441
+ in this repo's jsdom lane: gantt, calendar and map hold their DOM flat as rows
442
+ grow (virtualised task list; four events per day cell; auto-clustering above
443
+ 100 markers), while `ObjectTree` flattens every expanded node into the document
444
+ at a linear **5.2 DOM elements per record** with no virtualisation. 2,000 rows
445
+ is where the worst of the four lands at ~10,400 elements — an order of
446
+ magnitude above Lighthouse's "excessive DOM size" warning, and still ~10x the
447
+ real application result set this card came from.
448
+
449
+ New exports on `@object-ui/react`: `NON_GRID_ROW_CEILING`,
450
+ `NON_GRID_ROW_CEILING_TOP`, `applyNonGridRowCeiling`, `NonGridRowCeilingNote`
451
+ and the type `NonGridCeilingResult`. Two new `common.*` i18n keys carry the
452
+ footnote copy in all ten packs.
453
+ - db3896c: `ObjectGantt` refreshes in place when its query really changes, instead of tearing the chart down to the loading placeholder (objectui#7237).
454
+
455
+ Once the chart has painted, a change to its sort, filter, permissions, search or bound source re-runs the query with the chart still mounted, so it keeps its scroll position, its collapsed groups and any inline edit in progress. While the query runs, a thin indeterminate bar over the chart marks the rows on screen as the previous answer, and the rows are replaced when the new answer lands. It is the same `RefreshIndicator` that `ObjectGrid`, `ListView` and `ObjectChart` draw over their rows. The initial load still shows the loading placeholder.
456
+
457
+ The bar also shows during the chart's other in-place re-reads: the toolbar refresh, the re-read after a drag, a dependency link, a delete or a field edit, and a re-read triggered by the data-invalidation bus. Those already kept the chart mounted, but the only sign of them was a disabled refresh button.
458
+
459
+ A changed query that fails is still reported as an error, as it was before. Only a re-read of the same query keeps its last good rows when it fails.
460
+
461
+ `@object-ui/i18n`: new key `gantt.aria.refreshing`, the bar's accessible name, in all ten locale packs.
462
+ - b041b9c: `@object-ui/core` publishes `resolveRecordSourceObjectName`, the ONE reader for "which
463
+ object is this block bound to".
464
+
465
+ Six view plugins each spelled that resolution locally — `ObjectCalendar` twice,
466
+ `ObjectGantt`, `ObjectTree` twice, `ObjectMap`, `ObjectGrid` — and had drifted: three
467
+ wrote `?? schema.objectName`, one `|| ''`, one `: undefined`, one an `'object' in
468
+ dataConfig` test. They now delegate to one function that states the published
469
+ record-source ladder `77cb489b4` declared (`data`, then `staticData`, then `objectName`) once.
470
+
471
+ **No behaviour changes.** Each site's pre-collapse expression is transcribed verbatim
472
+ into `record-source.behaviourNeutrality-7627.test.ts` and asserted equal to its
473
+ post-collapse spelling across the whole contract-valid input matrix — both bindings
474
+ present, data only, `objectName` only, empty `objectName`, empty `data.object`, the
475
+ `api` / `value` / `staticData` / array-shorthand providers, and nothing bound.
476
+
477
+ **Two questions stay two questions.** `normalizeListViewSchema`'s gap-fill (#7477,
478
+ ruling B, landed as `00d2fa682`) is untouched and is NOT re-pointed at the new reader: it answers
479
+ how `objectName` gets POPULATED when absent, where an already-present `objectName` wins.
480
+ The new reader answers which object a block RESOLVES, where the `data` block wins — the
481
+ order declared on both published faces in `@object-ui/types` and pinned by
482
+ `objectql-record-source-refinement-6939.test.ts`. Merging them would silently override
483
+ one standing ruling or the other.
484
+
485
+ **`ObjectGantt`'s `persistLayoutKey` is deliberately excluded** and keeps its inverted
486
+ order, with an in-place comment saying why: its receiver is a localStorage key
487
+ (`gantt-layout:KEY:filters`), not a record source, so re-pointing it would orphan every
488
+ saved layout and filter-chip set of a view carrying both bindings. Two more sites the
489
+ finding listed are not object-name readers at all and were struck: `ObjectGantt`'s
490
+ refresh-handler predicate (`object` OR `api`) and `plugin-dashboard`'s `isObjectProvider`
491
+ type-guard over a widget's `data`.
492
+
493
+ `useSettledSchema`'s doc comment stops prescribing the hand-written ladder at all four
494
+ lines that taught it, so the copies cannot re-seed from the hook that replaced them.
495
+ - edea22a: **BREAKING** — `SchemaRendererProvider`'s `dataSource` prop, and the context
496
+ type every `useSchemaContext()` consumer reads back, are the published
497
+ `DataSource` contract instead of `any`.
498
+
499
+ **FROM** `dataSource={anything}` **TO** `dataSource={adapter}` — a `DataSource`
500
+ from `@object-ui/types`, or `null` / `undefined` when the host has no adapter
501
+ bound.
502
+
503
+ ```ts
504
+ // before — compiled, and failed at runtime on the first find()
505
+ <SchemaRendererProvider dataSource={'not-an-adapter'}>
506
+ // before — compiled, and no reader can do anything with it
507
+ <SchemaRendererProvider dataSource={{}}>
508
+ // after
509
+ <SchemaRendererProvider dataSource={adapter}> // a DataSource
510
+ <SchemaRendererProvider dataSource={undefined}> // "I have no adapter"
511
+ ```
512
+
513
+ Both sites are typed `DataSource | null | undefined` — the spelling
514
+ `useSettledSchema` in this same package already used. The two absences are part
515
+ of the contract, not a weakening of it: a Studio preview, a `kind:'react'` page
516
+ rendered before the host's adapter connects, and a widget probe driving
517
+ `apiFetch` alone all render with nothing bound, and every reader in the tree
518
+ already guards for it. What the union refuses is everything that is not an
519
+ adapter: a string, an empty object, a plain data bag, a partial adapter missing
520
+ a required member.
521
+
522
+ The measured cost, both halves, because the two `any`s have different blast
523
+ radii (measured separately on `origin/main`, whole-repo type-check over the 33
524
+ packages that depend on `@object-ui/react`):
525
+
526
+ - the **context type** — the `any` that reaches every `useSchemaContext()`
527
+ reader — reds **7 diagnostics at 7 sites in 4 packages**, all of them
528
+ production code or a mocked module factory.
529
+ - the **provider prop** — the injection points — reds **52 diagnostics at 27
530
+ sites in 11 packages**, all but one of them test doubles.
531
+
532
+ That ordering is the reverse of the prediction on the card: the context `any`
533
+ was expected to be the expensive one because it infects the whole tree, and it
534
+ is the cheap one, because every reader in the tree already guarded and none of
535
+ them ever reached past `find` / `getObjectSchema`. The prop is the expensive
536
+ one, because the injection points are overwhelmingly test doubles that were
537
+ never complete adapters. The full accounting is on objectui#7912.
538
+
539
+ Two runtime behaviours change, both in the "no adapter" direction and both
540
+ strictly closer to what the surrounding code already intended:
541
+
542
+ - `@object-ui/components`' `kind:'react'` page passed an empty object as its
543
+ "no adapter yet" stand-in. An empty object is TRUTHY, so it walked past every
544
+ `if (!dataSource)` guard written to catch exactly that state and failed later,
545
+ at the call. It now passes the absent adapter itself, so the guard fires where
546
+ it was meant to. The module-constant identity that stand-in existed for is
547
+ preserved: `null` is a primitive, so the provider's memo is unaffected.
548
+ - `@object-ui/plugin-calendar`, `@object-ui/plugin-gantt` and
549
+ `@object-ui/plugin-kanban` collapse a `null` adapter from the context to
550
+ `undefined` before handing it to their widget, whose prop declares the single
551
+ spelling `dataSource?: DataSource`.
552
+
553
+ Nothing else moves at runtime: no value flowing through this key changes, and
554
+ no data path is touched. A TypeScript consumer outside this repo that handed
555
+ this prop something other than an adapter now gets a compile error naming the
556
+ key (TS2322 / TS2739 / TS2740), which is why the FROM/TO is spelled out above.
557
+
558
+ Five `as any` reads of this context in `@object-ui/fields` are gone — they were
559
+ redundant the moment the seam became honest — and `LookupField`'s local
560
+ re-declaration of the imported context as a `Context` of `any`, which laundered
561
+ its `dataSource` read while looking typed, is gone with them. Both directions of
562
+ the contract are pinned against the real compiler in
563
+ `SchemaRendererContext.dataSourceType.pin.test.ts`, and the card's planted
564
+ documentation probe (a bare string in `packages/react/README.md`'s provider
565
+ example) now fails `pnpm check:doc-snippets`, where it used to exit 0 with zero
566
+ diagnostics.
567
+
568
+ objectui#7912.
569
+ - 233a1b3: Declare the `filter` and `sort` inputs on the `object-map`, `object-gantt`,
570
+ `object-timeline` and `view:timeline` registrations (objectui#8220) — the html
571
+ tier stops reporting `unknown-prop` on two keys the spec declares and all three
572
+ renderers read.
573
+
574
+ objectui#7712's and objectui#8171's defect, three blocks over. `ObjectMap`,
575
+ `ObjectGantt` and `ObjectTimeline` each lower the authored keys onto their own
576
+ query — `$filter` (the authored `filter`, its context tokens resolved first) and
577
+ `$orderby: convertSortToQueryParams(schema.sort)` — but none of the four
578
+ registrations publishing those renderers listed either key in `inputs`, and
579
+ `sdui-parser`'s `validateTree` reports `unknown-prop` for every key no `inputs`
580
+ entry claims. An author writing the spelling that works was told it was unknown.
581
+
582
+ Unlike the kanban and calendar cases, these three blocks had no spec row when the
583
+ defect was filed, so declaring the keys then would have published an authoring
584
+ surface no contract backed. That order is now met on the installed package:
585
+ `@objectstack/spec` 17.5.0 maps `object-map`, `object-gantt` and `object-timeline`
586
+ in `ComponentPropsMap`, each row declaring `filter` as the `ViewFilterRule` array
587
+ and `sort` as the `SortItem` array. ADR-0049 enforce-or-remove therefore resolves
588
+ toward **declare**: both keys have live readers on both ends.
589
+
590
+ Both keys are declared `type: 'array'`. For `filter` that is the rule-array arm
591
+ `[{ field, operator, value }, ...]` and nothing else: the spec refuses the
592
+ MongoDB-style record form at all three doors, and with the key declared as an
593
+ array the html tier now refuses it too, as a `type-mismatch`, instead of passing
594
+ it as an unknown key. `sort` takes `[{ field, order }]`.
595
+
596
+ `view:timeline` declares the same pair as `object-timeline`: it is the same
597
+ renderer under a second tag, the `view:calendar` precedent. The map's and the
598
+ gantt's bare `view:` twins are already retired (objectui#10393, objectui#8008),
599
+ so four registrations carry the declaration, not six.
600
+
601
+ Pinned per plugin in `__tests__/queryKeysDeclared-8220.test.tsx`: the real
602
+ validator over a manifest built from the live registry, with an undeclared-key
603
+ control; the installed spec row's verdict on the same values; and a mount through
604
+ `SchemaRenderer` showing the rule array reach `$filter` and the sort items reach
605
+ `$orderby` on every tag.
606
+
607
+ Not changed here: the console's `registry-inputs-spec-parity` ledger. It does not
608
+ load these three plugins yet and books the blocks as unjudged, owed to
609
+ objectui#11168, so this change moves none of its rows.
610
+
611
+ **Note, 2026-10-02 (objectui#11168 slice 5, shipping in this same release).**
612
+ The last paragraph above says the console's `registry-inputs-spec-parity` gate
613
+ does not load these three plugins yet and books the blocks as unjudged. That no
614
+ longer holds for the release: objectui#11168 loaded all three in this same
615
+ release (`object-map` in slice 3, `object-gantt` in slice 4, `object-timeline`
616
+ in slice 5), so the gate judges each registration in both directions, and its
617
+ unjudged-block ledger books none of them. This change itself still moved none
618
+ of those rows.
619
+ - 91facae: **Breaking behaviour change — a view block now honours only the `data` spelling its published row declares.**
620
+
621
+ Maintainer ruling, decision batch #83 (2026-09-08), verbatim 「8348 以协议为准」: the contract decides. What `os validate` and the save gate refuse under `data`, the renderer refuses too. The shared record-source ladder (`resolveRecordSourceConfig` in `@object-ui/core`) now takes the arm the calling block's row declares, and rung 1 applies only on that arm.
622
+
623
+ ⚠️ **`object-calendar` documents authored against the tolerated spelling stop rendering those rows.** The ladder falls past `data` to `staticData`, then to `objectName` — so such a calendar queries its object instead, or draws nothing when it names neither. This is accepted, with no transition window and no staged deprecation (the standing 2026-08-27 posture).
624
+
625
+ **Per block — what the published row says, and what actually moves:**
626
+
627
+ - **`object-calendar`** — row: `ComponentPropsMap['object-calendar'].data` is `z.array(z.unknown())` ("Pre-fetched records — skips the internal fetch"). A record-source **config object** under `data` — `{ provider: 'value', items }`, `{ provider: 'object', object }`, `{ provider: 'api', … }` — is no longer honoured, and this is a real end-to-end change: that object had exactly one carrier into the block, so an authored calendar written that way now queries its object (or draws nothing) instead of drawing the authored rows. There is no longer an api-provider branch to reach here. An **array** under `data` is unchanged, as are `staticData` and `objectName`.
628
+ - **`object-grid`** — row: the `ViewData` union, whose own description says "the bare-array shortcut is refused". `getDataConfig`'s `Array.isArray(schema.data)` head is removed, so the array is no longer a record source at the ladder. ⛔ Measured: this is **not** an end-to-end change for a node rendered through `SchemaRenderer`. An authored `data` array also arrives on the **props channel** (`SchemaRenderer` spreads node keys as props; `ObjectGrid`'s `passedData` lifts an array at higher priority), so such a grid still drew its rows when this landed. The removal took the second read, not the last one; objectui#9571 closed the props carrier afterwards.
629
+ - **`object-map`** — no `ComponentPropsMap` row existed when this landed; the governing row was this repo's own `ObjectMapSchema.data`, `ViewDataSchema.optional()` (the protocol row has since been published, and is the `ViewData` union too). Its array-shorthand head is removed on the same terms, with the same measured caveat at the time: through `SchemaRenderer` the props channel still drew an authored array, until objectui#9571. `data: { provider: 'value', items }` and `staticData` are unchanged.
630
+ - **`object-gantt`** — no `ComponentPropsMap` row when this landed; the governing row was `ObjectGanttSchema.data`, `ViewDataSchema.optional()` (the protocol row has since been published, and is the `ViewData` union too). A bare array under `data` is no longer a record source. Nothing observable moves: this block never lifted one, the array carried no `provider` and matched no fetch branch, and its renderer forwards no host props.
631
+ - **`object-tree`** — **unchanged by this change.** When it landed, no published face declared a `data` row for this block: not `ComponentPropsMap`, not `ObjectTreeSchema` (which declares `objectName` required and no `data`), not its registration `inputs`. Neither arm of the ruling reached it, so its rung 1 kept its previous behaviour and the block was reported rather than guessed at. Once the protocol published `ComponentPropsMap['object-tree']`, the tree moved to the `ViewData` arm too — see the separate `object-tree` entry for objectui#8348.
632
+
633
+ The `data` **prop** — the pre-fetched rows a host such as `ObjectView` or `ListView` passes down — is a different carrier and is untouched on every block. That it is also reachable from an authored node key, because `SchemaRenderer` spreads node keys as props, is what limits the grid and map halves above; it is reported on objectui#8348 rather than changed here.
634
+ - a1c00e3: Honour `filter`, `sort` and the platform row ceiling on a gantt's inline
635
+ (`provider: 'value'`) data (objectui#8769).
636
+
637
+ **The defect was fail-open.** `ObjectGantt`'s `reload` short-circuited the
638
+ inline provider — it set the authored rows and returned BEFORE the adapter
639
+ query, which is the one site that lowers `schema.filter` to `$filter`,
640
+ `schema.sort` to `$orderby` and the objectui#7210 ceiling to `$top`. So an
641
+ inline gantt that declared a `filter` drew **every** authored row, with no
642
+ diagnostic. The key that was dropped is the key that NARROWS, which is why this
643
+ matters: the chart answered a wider question than the author asked. ⛔ Nothing
644
+ was exposed that was not already in the authored schema — this is a
645
+ correctness defect, not a data-access one.
646
+
647
+ Measured two-sided before the repair: the same five rows and the same
648
+ `status = open` filter drew 3 rows through a fetching data source and 5 rows
649
+ inline, with the same matcher on both sides.
650
+
651
+ **What changed.** The inline branch is gone; `provider: 'value'` now goes
652
+ through `resolveDataSource`'s `ValueDataSource` like every other provider,
653
+ which already implements `$filter` / `$orderby` / `$skip` / `$top` / `$select`
654
+ over its own array. No filter combinator was written for this change.
655
+
656
+ **Behaviour you may notice.**
657
+
658
+ - An authored `filter` / `sort` now narrows and orders inline rows. Both
659
+ spellings reach it: `data: { provider: 'value', items }` and `staticData`.
660
+ - The row ceiling now applies to inline rows: past 2,000 drawn rows the chart
661
+ draws 2,000 and shows the footnote naming both numbers, as it already did for
662
+ fetched rows. It is applied to the **filtered** set, so a large inline array
663
+ that a `filter` cuts below the ceiling draws every matching row and stays
664
+ quiet. Rows a host passes down through the `data` React prop are still never
665
+ capped — those are not ours to cap.
666
+ - Inline rows now reach the chart as the adapter's own deep copy rather than as
667
+ the authored array's object identities. `ViewData.items` is serializable
668
+ metadata, so every value the contract admits survives that copy unchanged;
669
+ code comparing a row handed to `onTaskClick` against the authored array with
670
+ `===` would need `id` equality instead.
671
+ - An inline gantt's own write-backs (drag, dependency edit, inline edit,
672
+ delete) now survive the reload that follows them, because the reload reads
673
+ the adapter that took the write instead of re-reading the authored array over
674
+ the top of it.
675
+ - A filter comparand that `@object-ui/core`'s `convertFiltersToAST` refuses does
676
+ **not** throw at render on this path: the inline matcher is local and never
677
+ reaches that converter. The row is excluded and the reason is logged once.
678
+ - 093af32: Take the `@objectstack/*` line to 17.4.0 and follow every contract it moved
679
+ (objectui#8772, with #7783 · #7663 · #8172 · #7845 · #8785).
680
+
681
+ **Breaking on one authored key, deliberately.** A dashboard node's
682
+ `refreshInterval` is now `refreshIntervalSeconds` — the value is unchanged
683
+ (seconds), and the spec refuses the old spelling by name with a message naming
684
+ the new one, so an existing document fails loudly at parse rather than silently
685
+ losing its auto-refresh. `os migrate meta --from 17` lists the mechanical edits.
686
+ The report component's own `refreshInterval` is a different key and is NOT
687
+ affected. (Scored `minor`, not `major`: this repo's fixed group tracks the
688
+ `@objectstack` major — AGENTS.md §版本号策略.)
689
+
690
+ Also authored-surface changes, all following a published spec move rather than a
691
+ local decision:
692
+
693
+ - `element:record_picker`'s `filter` input is now the `ViewFilterRule` array
694
+ form `[{ field, operator, value }, …]`. The MongoDB-style record form is
695
+ refused by the contract (objectstack#14406 converged the last record-form
696
+ `filter` in the map), so a JSX page writing the array form no longer draws a
697
+ false `type-mismatch` and one writing the record form is told.
698
+ - `object-kanban` now publishes `limit`, the row cap its renderer has always
699
+ lowered to `$top`. The spec declares it as of objectstack#16503, so the key
700
+ the docs teach is finally one the save gate stores.
701
+ - `object-gantt`'s ten extension keys (`timeSegments`, `interactions`,
702
+ `lockField`, …) are derived from the spec's `GanttConfigSchema` instead of
703
+ being re-declared locally. Same accept set on the flat face; the nested
704
+ `gantt` block narrows to the spec's, which now refuses an undeclared sub-key
705
+ by name where its `.passthrough()` window used to admit one.
706
+ - The console's preview-gallery samples — the worked examples an author copies —
707
+ move with two spec changes of their own: a job's `timeout` is now `timeoutMs`
708
+ (same unit-in-the-key-name ruling as the dashboard key above), and a flow's
709
+ end node writes `outcome: 'completed'`, the enum having narrowed to
710
+ `completed | refused`.
711
+ - adf5812: Four node type keys retire, and the kanban and gantt families converge on their
712
+ `object-*` spellings: `kanban` (objectui#8802), `kanban-ui` and `kanban-enhanced`
713
+ (objectui#8257), and `gantt` (objectui#8008). All four were ruled by the
714
+ maintainer in one batch on 2026-09-09.
715
+
716
+ **⛔ No stored document moves.** The strings `kanban` and `gantt` name two
717
+ different things at two different layers, and only one of them is retiring:
718
+
719
+ | layer | value | who writes it | retired? |
720
+ | --- | --- | --- | --- |
721
+ | stored `NamedListView.type` | `"kanban"`, `"gantt"` | `CreateViewDialog`, persisted per tenant | **no — untouched** |
722
+ | node type key | `kanban`, `gantt` | hand-authored JSON | **yes** |
723
+
724
+ `ObjectView`'s `switch (viewType)` maps a stored view type onto the node type it
725
+ renders, and it already emitted `object-kanban` and `object-gantt` — as it does
726
+ for all twelve stored view types. So every kanban and gantt view any user ever
727
+ created through the console already renders through the surviving spelling.
728
+ Nothing in a tenant database changes, and ⛔ nothing should be migrated there.
729
+
730
+ **What each retirement was, measured.** Three of the four were
731
+ registration-only: no schema face in `@object-ui/types` ever declared
732
+ `kanban-ui`, `kanban-enhanced` or `gantt` as a component node type, so
733
+ unregistering is the whole retirement. The bare `kanban` key was the exception —
734
+ it had a declared arm on both faces (`KanbanSchema` in `complex.ts` and its Zod
735
+ mirror), and a plain deletion there would have been the objectui#7664 failure:
736
+ `BaseSchema` is `.passthrough()`, so a document naming a dropped key validates
737
+ green and renders nothing. It therefore retires as a **named refusal**: the Zod
738
+ union keeps an arm claiming the literal and answers a `{ "type": "kanban" }`
739
+ document with a message naming `object-kanban` as the remedy, while the
740
+ TypeScript half is the absence of the arm from `ComplexSchema` and of the key
741
+ from `SchemaRegistry`, so `tsc` refuses it at the authoring site.
742
+
743
+ **⭐ This closes objectui#8818's `objectFields` hole — for that ENTRY, not for
744
+ the class.** `SchemaRenderer` strips a fixed enumerated metadata list and
745
+ spreads the rest as React props; `objectFields` is not on that list, and
746
+ `KanbanRenderer` — the component the `kanban-ui` key resolved to — declares
747
+ `objectFields` as a real prop, so an authored value reached the predicate layer
748
+ with no schema face judging it. With the registration gone, no authored node
749
+ reaches that component through the registry. ⚠️ The **class** is still open: the
750
+ hole returns the moment another registered renderer declares an `objectFields`
751
+ prop. objectui#8818's option (a) — stripping at the `SchemaRenderer` boundary —
752
+ is what would close the class.
753
+
754
+ Superseded in this release by objectui#8818: option (a) landed, so the class
755
+ is closed as well. `objectFields` is now on `SchemaRenderer`'s stripped-metadata
756
+ list, and the legacy `props` alias bag drops it too, so an authored
757
+ `objectFields` reaches no component prop on any type key. The paragraph above
758
+ describes the tree this entry was written against.
759
+
760
+ **⚠️ What the `kanban` arm took with it, stated because it is the cost of this
761
+ change.** That arm was the only schema face that ever declared `columns`,
762
+ `cardTitle`, `swimlaneField`, `grouping` and `navigation`, the only one that
763
+ refused `allowCollapse` / `cardTemplates` / `columnWidths` / `titleField` /
764
+ `draggable` / `onColumnAdd` / `onCardAdd` by name, and — through
765
+ `columns: KanbanColumn[]` — the only one that judged a lane's `cards`
766
+ (`240b80f31`).
767
+
768
+ ⭐ **The sentence that stood here — «The surviving `ObjectKanbanSchema` face
769
+ declares none of them» — is retired, and the two reasons it failed are DIFFERENT
770
+ defects (objectui#9713).** It is replaced by a dated reading rather than silently
771
+ overwritten, because half of it was true when written and erasing that would be a
772
+ false record of its own:
773
+
774
+ | key named just above | on `ObjectKanbanSchema` when this entry was written (`adf581278`, 2026-09-10) | on `main`, 2026-09-17 | what moved |
775
+ | --- | --- | --- | --- |
776
+ | `columns` | not declared | **declared** | objectui#8913 (PR objectui#8989), six hours after this entry was written |
777
+ | `cardTitle` | not declared | **declared** | objectui#9606 (PR objectui#9709) |
778
+ | `titleField` | **declared** | **declared** | nothing — the sentence was never true of this key |
779
+ | `allowCollapse` | **declared**, a live `z.boolean().optional()` | **declared**, as a `retirementTombstone()` | objectui#8801 retired it; it was declared on this face throughout |
780
+ | `swimlaneField`, `grouping`, `navigation`, `cardTemplates`, `columnWidths`, `draggable`, `onColumnAdd`, `onCardAdd`, and a lane's `cards` | not declared | not declared | nothing |
781
+
782
+ ⇒ For `columns` and `cardTitle` the claim **ROTTED**: it was true on 2026-09-10 and
783
+ was falsified afterwards by cards that had no reason to read this file. For
784
+ `titleField` and `allowCollapse` it was **BORN FALSE**: those two are named above as
785
+ keys the `kanban` arm refused BY NAME — which the surviving face indeed does not do
786
+ — but the surviving face declared both of them the whole time, and «declares none of
787
+ them» said otherwise. ⛔ Do not restate any of this in the present tense: a pending
788
+ entry publishes verbatim into the CHANGELOG, and an undated present-tense claim
789
+ about another file is the construction that failed here.
790
+
791
+ ⛔ Nothing about an `object-kanban` document changes: it was never judged by the
792
+ `kanban` arm, so all of those keys have always ridden `BaseSchema`'s index
793
+ signature there. What is gone is the `kanban` document that had them. Declaring
794
+ them on `ObjectKanbanSchema` would WIDEN a published accept set, which is a
795
+ maintainer ruling and not part of this one; every one of these readings is
796
+ pinned where it can be seen rather than left to be rediscovered.
797
+
798
+ **Migrating.** Replace `"type": "kanban"` with `"type": "object-kanban"` and
799
+ `"type": "gantt"` with `"type": "object-gantt"` in hand-authored documents. The
800
+ `object-kanban` face requires `groupBy` and one of `bind` / `data` /
801
+ `objectName`; a purely static board (lanes carrying their own cards, no record
802
+ source) adds `"groupBy"` and `"data": []`. `kanban-ui` and `kanban-enhanced`
803
+ have no authored documents anywhere in this repository to migrate.
804
+
805
+ **⚠️ The namespaced spellings retire with the registrations — `view:kanban` and
806
+ `view:gantt` are the same two keys.** `ComponentRegistry.register(type, C,
807
+ { namespace })` stores BOTH `namespace:type` and a bare-`type` fallback, so
808
+ every one of these keys had a namespaced twin that goes with it:
809
+
810
+ | retired spelling | namespaced twin | author instead |
811
+ | --- | --- | --- |
812
+ | `kanban` | `view:kanban` | `object-kanban` |
813
+ | `gantt` | `view:gantt` | `object-gantt` |
814
+ | `kanban-ui` | `plugin-kanban:kanban-ui` | `object-kanban` |
815
+ | `kanban-enhanced` | `plugin-kanban:kanban-enhanced` | `object-kanban` |
816
+
817
+ Both spellings are pinned as gone, each against a firing control on the
818
+ surviving key, in `plugin-kanban/src/__tests__/kanban-family-registry-keys-retired-8257.test.ts`
819
+ and `plugin-gantt/src/__tests__/bare-gantt-node-key-retired-8008.test.ts`.
820
+
821
+ **What an unmigrated `view:kanban` / `view:gantt` node now renders depends on
822
+ the host.** In `apps/console` it renders the protocol **placeholder** panel, not
823
+ the OBJUI-001 "Unknown component type" error: the console calls the opt-in
824
+ `registerPlaceholders()` (`@object-ui/components`, `renderers/placeholders.tsx`)
825
+ *after* its plugin registrations, `view:kanban` and `view:gantt` are both in
826
+ that file's `PROTOCOL_COMPONENTS` list, and the placeholder only claims a key
827
+ nothing else has taken — which, until this change, `@object-ui/plugin-kanban`
828
+ and `@object-ui/plugin-gantt` had. In every other host, which does not call that
829
+ bootstrap, the same node renders OBJUI-001.
830
+
831
+ **⚠️ `objectui check` will NOT flag either namespaced spelling.** The CLI's
832
+ `known-schema-types.ts` is generated from the repository's real registration
833
+ calls, and the placeholder registration is a real one — so `view:kanban` and
834
+ `view:gantt` are still on that list and still validate green, while the node
835
+ renders a placeholder rather than a board. The bare `kanban` / `gantt` entries
836
+ DID leave the generated list; only the namespaced pair survives, and only
837
+ because of the placeholder. Grep your documents for the namespaced spellings
838
+ directly; do not rely on `objectui check` to find them.
839
+
840
+ `KanbanRenderer` is still exported from this package's entry point
841
+ (`@object-ui/plugin-kanban`); only its registry key is gone. ⚠️ `KanbanEnhanced`
842
+ is a different case, and the earlier draft of this note stated it wrongly: this
843
+ package's `exports` map has exactly two entries — `.` and `./style.css` — and
844
+ the barrel never re-exported the component, so
845
+ `@object-ui/plugin-kanban/KanbanEnhanced` has never been a resolvable specifier
846
+ for a consumer. At this change, with `kanban-enhanced` unregistered,
847
+ `KanbanEnhanced.tsx` had zero non-test importers, and the file was deliberately
848
+ left in place: deleting published-but-unreachable source is a further narrowing
849
+ and needed its own maintainer ruling, which this change did not have.
850
+
851
+ ⚠️ **Dated note, 2026-09-25 — that ruling came, and the file has since been
852
+ deleted — objectui#8932.** Later in this same release
853
+ `packages/plugin-kanban/src/KanbanEnhanced.tsx` was deleted, and with it the
854
+ `dist/KanbanEnhanced.d.ts` typings this package shipped for it. The rest of this
855
+ entry is kept as the reading of this change; the objectui#8932 entry states what
856
+ ships.
857
+
858
+ **⚠️ `@object-ui/sdui-parser`: `QUICK_ADD_HOST_TYPES` loses `kanban` with the
859
+ registration.** The `inert-quick-add` diagnostic (objectui#8285) named the two
860
+ tags `ObjectKanbanRenderer` answered to; one of them retires here, so the set is
861
+ now `{ 'object-kanban' }`. ⛔ Nothing is silently dropped by that narrowing, and
862
+ this is measured rather than argued: `checkKanbanQuickAdd` has exactly one call
863
+ site — `validate.ts`'s per-prop walk — and that walk runs only in the branch
864
+ where the manifest RESOLVED the tag. A tag no registration produces is answered
865
+ one level up by `unknown-component`, an **error**, and its props are never
866
+ walked, so on a manifest built from the live registry a `<kanban quickAdd>` node
867
+ draws `error/unknown-component` and nothing else, against a firing control on
868
+ `<object-kanban quickAdd>` that still draws `warning/inert-quick-add`. Keeping
869
+ `kanban` in the set would have been reachable only through a hand-built manifest
870
+ declaring a component of that name — which, after this retirement, is somebody
871
+ else's component, and the message asserts things about `ObjectKanban` that would
872
+ be false of it. This supersedes the `kanban` half of the objectui#8285 entry.
873
+
874
+ **The diagnostic's remedy text moves from a tag to a component.** It used to end
875
+ "render `<kanban-ui>` from a React host that passes `onQuickAdd`". That sentence
876
+ is falsified by this change: `kanban-ui` is no longer a node type key, so a page
877
+ written to the old advice draws `unknown-component`. It now names
878
+ `KanbanRenderer` from `@object-ui/plugin-kanban` — still exported, still
879
+ forwarding both halves by identity — which is the surviving way to get the pair.
880
+ `content/docs/plugins/plugin-kanban.mdx` says the same thing the same way.
881
+ - 7098eed: One record-overlay shell: all five list-type renderers honour all four overlay
882
+ `navigation.mode` values (objectui#9299, director seat decision batch #128 item
883
+ 1, 2026-09-13).
884
+
885
+ `ObjectGantt`, `ObjectKanban` and `ObjectCalendar` rendered one drawer for every
886
+ authored mode — `modal`, `split` and `popover` silently WERE the drawer, with no
887
+ diagnostic. `RecordDetailDrawer`'s payload is extracted into the new
888
+ `RecordDetailPanel` (shell-free by construction) and mounted through the shared
889
+ `NavigationOverlay`, which is what `ObjectGrid` and `ObjectTree` already used.
890
+
891
+ User-visible on published surfaces:
892
+
893
+ - **`modal` / `split` / `popover` now do what they say** on the gantt, the
894
+ kanban and the calendar.
895
+ - **`split` renders.** Each renderer passes its own view as `mainContent`, so
896
+ the board / calendar / chart / tree / grid sits beside the record panel.
897
+ Authored `split` used to render NOTHING on `ObjectTree` — and, measured while
898
+ fixing this, on `ObjectGrid` too.
899
+ - **`popover` is anchored to the element the user clicked** — row, node, bar,
900
+ card, event — instead of degrading to a centred dialog. It was honoured on no
901
+ surface before.
902
+ - **Drawer chrome converges** on the shared shell's header (breadcrumb title,
903
+ close, optional expand) for the three renderers that brought their own.
904
+ - **Drawer widths carry over, they are not reset.** The two drag-resize
905
+ implementations become one: a width persisted under the retired
906
+ `objectui.drawerWidth.OBJECT` is read once, written forward to
907
+ `ov:drawer-width:OBJECT` and removed. One key per object across every view
908
+ type. The default width is unchanged at every viewport (objectui#6584); an
909
+ authored width below `min(60vw, 880px)` now widens to it, which is the shell's
910
+ long-standing policy on grid and tree.
911
+ - **Richer record body on grid and tree** — typed widgets, declared labels,
912
+ honoured `hidden` — wherever the object declares its fields. With nothing
913
+ declared those two renderers keep their own value-inference reading, which is
914
+ what preserves the locale-aware date fallback (objectui#4541), the localized
915
+ empty placeholder (objectui#8491) and the `format` hint (objectui#8920); the
916
+ overlay shell is the shared one on that path too.
917
+
918
+ New published API: `RecordDetailPanel`, `buildRecordDetailFields`,
919
+ `RECORD_OVERLAY_DEFAULT_WIDTH` (`@object-ui/plugin-detail`);
920
+ `useOverlayAnchor`, `recordOverlayWidthStorageKey`,
921
+ `legacyRecordDrawerWidthKey` and the `popoverAnchorRef` / `legacyStorageKey`
922
+ props on `NavigationOverlay` (`@object-ui/components`). `RecordDetailDrawer`
923
+ keeps its props and is now a thin wrapper over the shared shell. ⛔ No spec
924
+ change.
925
+ - 502eb58: The row/card click props on the view components now declare the modifier
926
+ payload they have always been invoked with (objectui#9357).
927
+
928
+ `useNavigationOverlay`'s `handleClick` invokes the handler it is given with two
929
+ arguments — the record, and an optional modifier payload (`metaKey` / `ctrlKey`
930
+ / `button`) a host needs to implement Cmd/Ctrl/middle-click. objectui#9360 made
931
+ the hook's own option say so. These components pass a host-supplied prop
932
+ straight into that option, so the value a host writes against them is invoked
933
+ with two arguments too — and every one of these props declared only the record.
934
+ The payload was therefore invisible on the one line a host reads, exactly as it
935
+ had been on the hook.
936
+
937
+ Thirteen declarations across nine packages now name both parameters:
938
+
939
+ - `ObjectGridComponentProps.onRowClick`
940
+ - `ObjectKanbanComponentProps.onRowClick` (its sibling `onCardClick`, the other
941
+ arm of the same fallback, already declared both)
942
+ - `KanbanRendererProps.schema.onCardClick`
943
+ - `ObjectCalendar`, `ObjectGantt`, `ObjectMap`, `ObjectTree`: `onRowClick`
944
+ - `ObjectTimeline`: `onRowClick` and `onItemClick`, the two arms of one fallback
945
+ - `ListView.onRowClick`
946
+ - `ObjectGallery`: `onRowClick` and `onCardClick`, likewise two arms of one
947
+ - `RelatedList.onRowClick`
948
+
949
+ **Source-compatible, and with no refused class.** A one-parameter handler is
950
+ still assignable to the widened signature, and a handler written against the
951
+ widened signature was already assignable to the narrow one — its minimum
952
+ argument count is still one. The second parameter is spelled `any` rather than
953
+ `HandleClickModifiers`, which is the difference that matters for callers: the
954
+ hook's own option names that interface and therefore refuses a handler whose
955
+ second parameter is annotated narrower (objectui#9360 documents that class and
956
+ the one-line remedy). These faces refuse nothing. A host that discovered the
957
+ payload from the implementation and annotated it `React.MouseEvent` — which is
958
+ what actually arrives — keeps compiling. `any` is also the spelling
959
+ `ObjectKanbanSchema.onCardClick` already carries for this same payload
960
+ (objectui#9341) and the one `BaseSchema`'s own `onClick` / `onChange` /
961
+ `onSubmit` use, and it is forced on the published twins in `@object-ui/types`,
962
+ which may not name a type that lives in a package depending on them.
963
+
964
+ **Runtime behaviour is unchanged.** Nothing is newly called and nothing newly
965
+ passes an argument; only the declarations move.
966
+
967
+ Three declarations that share the name and the shape are deliberately NOT
968
+ widened, because the value flowing through them is not invoked with the
969
+ payload: `VirtualGrid.onRowClick`, whose second parameter is a row index;
970
+ `ManageViewsDialog.onRowClick`, which receives a view id; and the `data-table`
971
+ family (`DataTableSchema.onRowClick`, `ObjectDataTableSchema.onRowClick`),
972
+ whose renderer invokes with one argument. Widening those would have declared a
973
+ payload that never arrives.
974
+ - 199d31b: **`viewMode` is now declared authoring surface on `ObjectGanttSchema`, and both
975
+ gantt renderer branches honour it** (objectui#5074, maintainer ruling
976
+ 2026-08-19: declare-and-wire; the spec half landed first upstream).
977
+
978
+ - `ObjectGanttSchema` (TS interface and zod mirror) declares `viewMode`,
979
+ DERIVED from the pinned `@objectstack/spec` `GanttConfigSchema.viewMode`
980
+ enum by reference, so the member list cannot drift. Deliberately no
981
+ default: an omitted `viewMode` keeps letting a persisted layout
982
+ (`persistLayoutKey`) seed the timeline granularity before the renderer's
983
+ `'day'` fallback.
984
+ - The timeline branch (`GanttView`) now receives an authored `viewMode`.
985
+ Previously only the resource-workload branch (`resourceView` +
986
+ `assigneeField`) honoured it, so `viewMode: 'month'` on an ordinary gantt
987
+ view was silently ignored.
988
+ - The `(schema as any).viewMode` cast in `ObjectGantt` is retired; both
989
+ branches read the declared `ganttConfig.viewMode`, which also honours the
990
+ key when authored inside the spec's `gantt` config block.
991
+ - Accept-set note: `viewMode` is now a DECLARED key, so an off-enum value
992
+ (e.g. `viewMode: 'hour'`) becomes a zod validation error where it
993
+ previously passed through unvalidated. Values on the published spec enum
994
+ are unaffected.
995
+
996
+ ### Patch Changes
997
+
998
+ - 3759c56: Gantt, chart and grid views refresh in place after a write instead of being rebuilt (objectui#10035).
999
+
1000
+ `ObjectGrid`, `ObjectGantt` and `ObjectChart` query for themselves and read no refresh input, so both object-view layers could show them a write only by remounting them — which lost a gantt's scroll, collapsed groups and zoom, a chart's open drill-down, and a grid's selection, column state and in-progress edit. Each now refetches when the data-invalidation bus (`notifyDataChanged` / `useDataInvalidation` from `@object-ui/react`) reports a change to the object it reads:
1001
+
1002
+ - `@object-ui/plugin-grid`: `ObjectGrid` re-reads its rows into the same table.
1003
+ - `@object-ui/plugin-gantt`: `ObjectGantt` re-reads silently and keeps the chart mounted, as its toolbar refresh does.
1004
+ - `@object-ui/plugin-charts`: `ObjectChart` re-runs its query on both binding shapes — an object-bound aggregate follows its `objectName`, a dataset-bound chart follows the dataset's base object as the `queryDataset` answer names it.
1005
+ - `@object-ui/plugin-view`: the object view keys every view on its identity alone, and declares on the bus its own saves and deletes and each `onMutation` write it hears.
1006
+ - `@object-ui/app-shell`: the object page keys its list and its chart view on identity alone, and declares on the bus the changes it learns of without a data-source write — server actions, flows, imports, realtime events and an explicit refresh.
1007
+
1008
+ Rows a host hands these components (`data`, `bind`, inline values) are still the host's to refresh; only the components' own queries follow the bus.
1009
+ - 75b0d0b: `ObjectGantt` no longer re-issues its record query because React threw a memo cache
1010
+ away (objectui#10036).
1011
+
1012
+ The fetch seam carried two dependencies that AGENTS.md §5 commandment #10 bans — the
1013
+ ninth and tenth instances of the class ruled on objectui#8640. `reload`'s dependency
1014
+ list named `effectiveDataSource`, a `useMemo` result, and the mount effect named
1015
+ `reload`, a `useCallback` result. Both hooks are documented performance hints: React
1016
+ may discard the cache and recompute even when the dependency list compares equal, and
1017
+ the object that comes back is then a new one.
1018
+
1019
+ That is not harmless here. `resolveDataSource` returns the context adapter UNCHANGED
1020
+ for `provider: 'object'`, but CONSTRUCTS a fresh `ApiDataSource` / `ValueDataSource`
1021
+ for `provider: 'api'` and `provider: 'value'` — so on those two providers a discard
1022
+ alone handed `reload` a brand-new adapter for a byte-identical authored config, rebuilt
1023
+ `reload`, and re-fired the mount effect: one redundant round trip per discard, on a
1024
+ view nobody had touched. A discarded `useCallback` moves `reload`'s identity whatever
1025
+ its own dependency list says, so the second half had to move with the first.
1026
+
1027
+ The record fetch now READS the adapter through a ref and KEYS on the values that
1028
+ determine it: the authored config slice `resolveDataSource` actually reads, per
1029
+ provider arm, plus the host's `dataSource` and `apiFetch`. Every authored or host
1030
+ change that used to refetch still refetches — a changed `api` endpoint, changed
1031
+ `read`/`write` config, changed inline `items`, a swapped adapter, a swapped
1032
+ authenticated fetch, a changed object, filter or sort. What no longer refetches is a
1033
+ discard, and an inert key inside `data` that the resolved adapter never reads.
1034
+
1035
+ The file already recorded half of this in the first person: `dataItems` came off that
1036
+ same dependency list because a discard «was enough to give `reload` a fresh identity
1037
+ and re-fire the mount effect below (objectui#6592)». One banned identity came off the
1038
+ line then; the other stayed on it until now.
1039
+ - 875ee61: fix(plugin-calendar, plugin-map, plugin-gantt): the registrations' `inputs` agree with the record-source rule
1040
+
1041
+ All three blocks read their records from one of `data`, `staticData` and
1042
+ `objectName` (in that order), and their `@object-ui/types` zod schemas enforce
1043
+ "one of the three" through `requireRecordSource`. The designer-facing `inputs`
1044
+ on the registrations disagreed with that rule in two ways:
1045
+
1046
+ - `object-calendar` and `calendar` still declared `objectName` as required, so
1047
+ the html tier's validator reported a `missing-required-prop` error on a
1048
+ calendar authored on `staticData` or `data`, which the schema accepts and the
1049
+ renderer draws. `objectName` is now declared without `required`, and its
1050
+ description states the rule, as objectui#7470 did for map and gantt
1051
+ (objectui#10392).
1052
+ - `object-map`, `map` and `object-gantt` did not declare `data` or
1053
+ `staticData`, so the validator reported a block authored on either as an
1054
+ unknown prop. At this change both were declared on all three, on the schema's
1055
+ own arms: `data` is a `{ provider, … }` data-source configuration (an object,
1056
+ so a bare array there draws a type diagnostic, matching the schema), and
1057
+ `staticData` is an array of records. Each description says what the renderer
1058
+ does with the key, including that the map does not implement the `api`
1059
+ provider (objectui#10394).
1060
+
1061
+ ⚠️ **Dated note, 2026-09-25 — the bare `map` registration has since been
1062
+ retired — objectui#10393.** Later in this same release `@object-ui/plugin-map`
1063
+ stopped registering the bare `map` key (and its namespaced twin `view:map`),
1064
+ so `map` declares nothing: a node authored `"type": "map"` resolves no
1065
+ renderer, and the html tier reports it as `unknown-component`. The
1066
+ `object-map` and `object-gantt` registrations keep both inputs exactly as
1067
+ described above. The rest of this entry is kept as the reading of this
1068
+ change; the objectui#10393 entry states what ships.
1069
+
1070
+ The renderers' read order and the zod schemas are unchanged. The
1071
+ `@object-ui/plugin-gantt` README sentence that listed the registration's inputs
1072
+ is updated.
1073
+
1074
+ **Correction, 2026-10-01 (objectui#11117).** "One of the three" now has an exception on all
1075
+ three blocks: a block that declares none of them is accepted when its `dataSource.object` names
1076
+ the object, because the registration's `ElementDataSourceGate` lands that name on `objectName`.
1077
+ The `objectName` input description now says so.
1078
+ - e5f4343: Four more date faces now follow the display locale, not the UI language (objectui#10442).
1079
+
1080
+ Each one takes its locale from `useDisplayLocale()` instead of the UI language. With an English UI and
1081
+ a `de-CH` display locale, a date that used to read `3/4/2020` now reads `4.3.2020`. With no display
1082
+ locale declared, the display locale falls back to the UI language, so these dates render as before.
1083
+
1084
+ - `data-table` (`@object-ui/components`): the ISO date and datetime cells.
1085
+ - The record page's History tab (`@object-ui/app-shell`): the `date` and `datetime` values in each
1086
+ field diff.
1087
+ - `ResourceWorkload` (`@object-ui/plugin-gantt`): the column labels and the cell tooltips. With no
1088
+ language at all it used to fall through to the machine's locale; it now gets the display locale's
1089
+ own last resort.
1090
+ - `CalendarView` (`@object-ui/plugin-calendar`): the default locale for the header, the weekday
1091
+ columns and the day cells. An explicit `locale` prop still wins over the display locale.
1092
+ - 2803fac: fix(plugin-gantt): a failed load no longer keeps `ObjectGantt` on its error screen after a later load succeeds
1093
+
1094
+ `ObjectGantt` sets `error` when the current reload fails, and the render returns
1095
+ the error screen early whenever `error` is set. Nothing ever cleared it. After one
1096
+ failed load (a filter or sort change against a flaky backend, say), every later
1097
+ load that succeeded still wrote its rows, but the chart stayed on the error screen
1098
+ until the component remounted.
1099
+
1100
+ The current reload now clears the error when it commits rows, whether it is a
1101
+ changed query or a silent re-read of the same one (a data-invalidation, say). Those
1102
+ rows answer the current query, so the earlier failure no longer describes the
1103
+ screen. A superseded reload's answer is discarded under the existing `isCurrent()`
1104
+ guard, and its clear is discarded with it, so it cannot remove an error the current
1105
+ reload reported.
1106
+
1107
+ The error is deliberately not cleared when a reload starts, although `ObjectGrid`'s
1108
+ load clears there. A silent re-read can overtake a changed query and then fail
1109
+ without reporting it. Had the changed query cleared the error when it started, the
1110
+ chart would go back to an older query's rows with nothing to say they are stale.
1111
+ Until rows that answer the current query land, the error stays on screen. Before the
1112
+ first paint the loading placeholder still shows while a query is in flight.
1113
+ - 9d89c6f: fix(plugin-gantt): a silent re-read that overtakes a changed query now reports that query's failure
1114
+
1115
+ `ObjectGantt` re-reads in two modes. A changed query (a sort, filter or search
1116
+ change) reports a failure on the error screen. A silent re-read of the same query
1117
+ (a data-invalidation, the toolbar refresh, or the read-back after a drag, resize or
1118
+ inline edit) only logs a failure and keeps the last good rows, because those rows
1119
+ still answer that query.
1120
+
1121
+ Only the newest re-read may commit, so a silent re-read that starts while a
1122
+ changed query is still in flight makes that query's run stale. The re-read reads
1123
+ the changed query too. When it failed, the chart kept the rows of the query before
1124
+ the change, with no error and no refreshing state. Those rows answer neither query
1125
+ the user asked for.
1126
+
1127
+ A silent re-read that overtakes a changed query in flight now takes over that
1128
+ query's report: its failure shows the error screen, as the changed query's own
1129
+ failure would. The report passes on if another silent re-read overtakes it, and it
1130
+ is released when the current re-read settles. The same holds for a silent re-read
1131
+ that overtakes the initial load, which used to leave an empty chart with no error.
1132
+ A silent re-read with nothing pending still only logs a failure and keeps its rows.
1133
+ No prop or export changes.
1134
+ - f9c06ef: Every data node that sends its own authored `filter` into a query now resolves the spec's context tokens first (objectui#10666). With `filter: [['owner', '=', '{current_user_id}']]` these nodes used to send the literal token; they now send the signed-in user's id, and `{current_org_id}` resolves to the active organization:
1135
+
1136
+ - `object-calendar`, `object-map` and `object-tree`, on both the object query and the inline (`provider: 'value'`) query;
1137
+ - `object-gantt`, `object-kanban` and `object-timeline`;
1138
+ - `record:related_list` and `record:line_items`, where the node's own filter is combined with the parent-record condition;
1139
+ - the `element:repeater`, `element:number` (both the `aggregate` filter and the `find` fallback) and `element:record_picker` page elements.
1140
+
1141
+ `list-view`, `object-grid` and `object-gallery` already did this, and are unchanged.
1142
+
1143
+ **New in `@object-ui/react`: `useResolvedFilter(filter, scope)`.** Pass it a node's authored filter and `useFilterScope()`. It resolves the filter through `@object-ui/core`'s shared `resolveFilterPlaceholders` and holds the result: re-rendering with an equal filter (even one rebuilt inline on every render) hands back the same value, so a fetch effect keyed on it does not run again, while a structurally different filter or a change of signed-in user or organization resolves again. A filter with no token to resolve is handed back as the value you passed in. The hold is the one `list-view` and `object-gallery` used privately; `plugin-list` now imports it from here, and no second copy remains in that package.
1144
+
1145
+ What changes for an app:
1146
+
1147
+ - A filter with no placeholders reaches the query as before, unchanged.
1148
+ - Nodes that re-queried whenever the host rebuilt an equal filter inline (`object-calendar`, `object-gantt`, `object-kanban`, `object-map`, `object-tree`) no longer issue those redundant queries.
1149
+ - Date macros such as `{today}` in these nodes' own filters are now resolved in the browser's local time, as they already are for `list-view`, `object-grid` and `object-view`. Before, they reached the server as literals, and the server resolved them in the tenant's time zone.
1150
+
1151
+ `@object-ui/types`: the `filter` docblocks on `ObjectMapSchema`, `ObjectTreeSchema`, `ObjectGanttSchema`, `ObjectCalendarSchema`, `ObjectKanbanSchema`, `ObjectChartSchema` and `ObjectGallerySchema` (and the matching zod descriptions) no longer say the filter is forwarded verbatim; they say its context tokens are resolved first. No type changes.
1152
+ - 1659f14: The gantt timeline now follows the display locale, not the UI language (objectui#10668).
1153
+
1154
+ `GanttView` takes its date locale from `useDisplayLocale()` instead of the UI language. This covers the
1155
+ timeline's column and band headers, the toolbar's period label, the task list's start and end dates,
1156
+ a bar's hover card, and the dates shown while a bar is dragged. With an English UI and a `de-CH` display locale, a week column that used to read
1157
+ `3/2` now reads `2.3.`, the same locale `ObjectGantt`'s tooltips and `ResourceWorkload` already use in
1158
+ the same chart. With no display locale declared, the display locale falls back to the UI language, so
1159
+ the timeline renders as before. With no language at all, it used to fall through to the machine's
1160
+ locale; it now gets the display locale's own last resort.
1161
+ - db0beb2: docs(plugin-gantt): authored `object-gantt` examples write their props in the `properties` bag (objectui#10859, batch 6)
1162
+
1163
+ The README's authored `object-gantt` examples now write `{ "type": "object-gantt", "properties": { …, "gantt": { … } } }`, the spelling `@objectstack/spec`'s `ComponentPropsMap['object-gantt']` row declares and `objectui validate` now requires, with the field mapping in the bag's `gantt` block. The flat field-mapping keys are described as what they are, the handoff `ObjectView` and `ListView` write onto the node they compose. The examples that mount `ObjectGantt` directly keep the flat `schema` prop: a component mounted without `SchemaRenderer` receives the node as it reads it, and nothing hoists a bag there. Under `src/`, a new render pin holds that the bag draws what the flat spelling drew, and the catalog-plans pin reads the catalog entries' bag. No runtime change.
1164
+ - 6650259: fix(plugin-calendar): a day event moved across a DST change writes the days it was dropped on (objectui#10866, slice 4)
1165
+
1166
+ - **plugin-calendar.** At this change the month grid moved each date of an event by the milliseconds between two local midnights, the grabbed cell's and the drop cell's, and a date-only value is read at local midnight of its day. So when a DST change lay between one of an event's dates and where it landed, but not between the two cells (or the other way round), that date came back an hour off local midnight; at 23:00 of the day before, the write took the day before. Under `America/Los_Angeles` a span of `date` fields moved across November 1st or March 8th could be written a day short at its start or its end. A move of an event whose start, and end when it has one, are both stored calendar days now writes each `date` field as its stored day moved by the whole days the grid moved it. Every other write is unchanged: a `datetime` field still writes the instant the grid hands back, and at this change the grid's own arithmetic does not change.
1167
+
1168
+ ⚠️ **Dated note, 2026-09-29 — the month grid now moves by calendar days — objectui#11005.** Later in this same release the month grid moves a value by the calendar days between the grabbed cell and the drop cell and keeps its time of day, for a move and for a drag of a span's end, so a 10:00 `datetime` stays at 10:00 across a DST change. A `date` value read at local midnight of its day then comes back at local midnight of the day it was dropped on, so the repair described above is removed and a moved `date` field is written as that local day, which is the same day the repair wrote. The rest of this entry is kept as the reading of this change; the objectui#11005 entry states what ships.
1169
+ - **plugin-gantt, types.** The business `timeZone` prose (`GanttConfig.timeZone`, `GanttViewProps.timeZone` and `makeTzShift`) said persisted data stays real instants. A `date` field under a zoned chart has been written as a calendar day since this card's first slice; at this change the prose says so, and says that near a DST change of the chart's zone or the viewer's the shim can place a day's midnight an hour early, onto the day before. Documentation only.
1170
+
1171
+ ⚠️ **Dated note, 2026-09-29 — a zoned chart reads and writes a day exactly on a DST change — objectui#10866, slice 5.** Later in this same release `ObjectGantt` inverts the shim exactly for a date-only day, so a stored day is drawn from its own midnight and a drop writes the day it was dropped on, on a DST change of the chart's zone or the viewer's too. The `GanttConfig.timeZone` and `GanttViewProps.timeZone` prose no longer says a day can land on the day before, and `makeTzShift`'s says a day does not take the shim's round trip. The rest of this entry is kept as the reading of this change; the slice-5 entry states what ships.
1172
+ - **core.** The `DATEADD` / `DATEDIFF` / `DATEFORMAT` docblock names how a mixed `DATEDIFF`, one day and one instant, reads each argument when it counts months or years. Comment only.
1173
+ - 4f8b7f8: fix(plugin-calendar,plugin-gantt): a stored date-only day shows on that day in every viewer zone, and a `date` field is written back as a calendar day (objectui#10866, slice 1)
1174
+
1175
+ The calendar and the gantt read a record's `YYYY-MM-DD` value with the engine's own `Date` parse, which reads it as UTC midnight. West of UTC a task due on the 5th therefore showed on the 4th, in both views. Moving it then wrote `toISOString()` into the field: a UTC instant stored in a `Field.date`.
1176
+
1177
+ - **Reads.** Every date-only read in the two plugins now goes through `toDisplayDate` from `@object-ui/core`, which reads the value at local midnight of the day it names. In the calendar these are the object calendar's event start and end, and the `calendar-view` node's events and its authored `currentDate`. In the gantt they are the task start, end and baselines, a marker authored as a day, and the day typed into the inline editor. A value with a time keeps its instant.
1178
+ - **Writes.** A calendar drop, a calendar quick-create and a gantt drag now write a field declared `date` as the local calendar day, `yyyy-MM-dd`. A `datetime` field keeps its instant. When no object schema is available to say which type a field is, the stored value's own shape decides, which is the same split the read makes; a calendar quick-create has no stored value, so there it still writes the instant.
1179
+ - **Gantt `timeZone`.** A chart with a business `timeZone` re-bases every instant into that zone. A date-only day is not re-based: its bar and its marker stand on that day of the chart's calendar for every viewer, and a drop writes the day of the chart's calendar that the bar was dropped on.
1180
+ - **Gantt working calendar.** `skipWeekends` / `holidays` now count the chart's own calendar days (local midnight, the same keys the day columns already folded by) rather than UTC days. The UTC floor put a rescheduled successor on the previous day in every zone except UTC once date-only values read as local days. `@object-ui/types` updates the `holidays` description to match.
1181
+
1182
+ The timeline, charts, formula date functions and i18n helpers are later slices of objectui#10866.
1183
+ - e119f12: fix(plugin-gantt): a gantt move shifts a task's end by the calendar days it shifts the start, keeping each value's time of day across a DST change (objectui#10866, slice 6)
1184
+
1185
+ On the day, week, month, quarter and year scales a drag snaps to whole days. The start moved by calendar days, but the end followed it by the elapsed milliseconds of the start's move, and a summary's group move carried every task beneath it by that same span. Across a DST change of the viewer's zone that span is a whole number of days plus or minus an hour. Under `America/Los_Angeles`, a `date` task from October 29th to October 31st moved three days wrote `end_date` `2026-11-02` where the drop reads November 3rd; a `datetime` end that crossed the change when its start did not moved its wall-clock time by an hour; a task under a moved summary could start on the day before the one it was dropped on. An edge drag past the other edge stopped 24 hours from it, which on a DST day is 23:00 of the day before, or 01:00.
1186
+
1187
+ - **Move.** A drag now counts the calendar days its snapped start moved and moves the start and the end by that many days on the local calendar. Each keeps its hours, minutes, seconds and milliseconds, as objectui#11005 ruled for the calendar's month grid, so a `date` task keeps its length in days and a 10:00 start stays at 10:00. This deliberately changes the instant a drag writes into a `datetime` end across a DST change; what a `datetime` field stores and how it is read are unchanged.
1188
+ - **Edge drags.** The end handle already moved the end by calendar days, keeping its time of day. An edge dragged past the other edge now stops one calendar day from it.
1189
+ - **Group move.** Dragging a summary moves the summary and every unlocked task beneath it by the same calendar days, and the live preview draws what the drop writes.
1190
+ - **Unchanged.** In a zone without DST every day is 24 hours, so a drag writes what it wrote before. The shift-band scale (`timeSegments` in day view) moves by bands on an elapsed-time axis and is unchanged.
1191
+ - f6ae5e2: fix(plugin-gantt): a zoned chart reads and writes a stored day as that day on a DST change (objectui#10866, slice 5)
1192
+
1193
+ A gantt with a business `timeZone` draws every date through a shim that re-bases it into that zone, and hands every dropped date back through the shim's inverse. Since this card's first slice, earlier in this same release, `ObjectGantt` has handed a date-only day in as the shim's inverse of the day's local midnight, and read a dropped `date` field back through the shim. Each direction reads the two zones' offsets at the instant it is handed, so on a DST day of one zone and not the other the round trip missed by an hour. An `America/Los_Angeles` viewer of an `America/New_York` chart saw a stored `2026-03-08` drawn from 23:00 on March 7th, and a drop onto March 8th wrote `2026-03-07`; `2026-11-01` was drawn from 01:00. A `Europe/Berlin` viewer of the same chart saw `2026-03-29` drawn from 23:00 on March 28th, and a drop onto it wrote `2026-03-28`.
1194
+
1195
+ - **plugin-gantt.** `ObjectGantt` now inverts the shim exactly for a day: it hands the view the instant the shim maps onto the day's local midnight, and writes the day of the display date the dropped instant was translated from. A stored day is drawn from its own midnight and a drop writes the day it was dropped on, on a DST change of the chart's zone or the viewer's too. Where the shim draws no instant at that midnight, as when the chart's zone changes its clocks at 00:00, the day is drawn from the first instant after it, on that day. A `datetime` value goes through the shim unchanged, and a chart with no `timeZone` is unchanged.
1196
+ - **types.** The `GanttConfig.timeZone` description said that near a DST change a day could be drawn, and a drop written, as the day before. It now says the day holds on a DST change too.
1197
+ - 0e6e76b: fix(plugin-gantt, plugin-calendar): the `objectName` input description names the `dataSource.object` binding (objectui#11117)
1198
+
1199
+ The designer-facing `objectName` input on `object-gantt` and `object-calendar` (and
1200
+ `view:calendar`, which shares the calendar's list) said the block's schema refuses a block that
1201
+ declares none of `data`, `staticData` and `objectName`. Since objectui#11117 the schema also
1202
+ accepts a block whose `dataSource.object` names the object, because the registration's
1203
+ `ElementDataSourceGate` lands that name on `objectName` before the renderer reads the node. The
1204
+ sentence now says so. No input's name, type, `required` flag or shape changed. (`object-map`'s
1205
+ input already names the binding: objectui#10859 batch 5 rewrote it.)
1206
+
1207
+ The `plugin-gantt` and `plugin-kanban` READMEs carry the same correction.
1208
+ - 858eafb: fix(plugin-gantt,core,plugin-timeline): both gantt surfaces read a date-only end inclusively through one core rule, and a drag writes the same day back (objectui#11141)
1209
+
1210
+ **A widening: `@object-ui/core` gains two exports**, `toDisplayEndDate(value)` and `toInclusiveEndDay(end)`, on its published entry beside `toDisplayDate` (the same file, `utils/date-display.ts`, re-exported by `export *`). Nothing else in `@object-ui/core` is added, removed, renamed or retyped.
1211
+
1212
+ - **A date-only end is inclusive on the object gantt too.** `ObjectGantt` read a stored end like a start, as the named day's local midnight, so every bar was drawn one day short and a successor starting the next day stood one day after its predecessor. The schema catalog's own plans drew that way. A task from `2024-01-01` to `2024-01-15` now runs through January 15th, and a successor starting `2024-01-16` begins exactly where it ends, as the timeline's gantt already drew it (objectui#11112). A task whose date-only start and end name the same day is now one day long, where it was a zero-length milestone. An end with a time part is still an instant, and the bar ends exactly there. Baseline ends read the same way.
1213
+ - **One rule, in `@object-ui/core`.** `toDisplayEndDate` reads an end: a date-only value becomes the start of the next day (a calendar day, so 23 or 25 hours across a DST change), and anything else is read as `toDisplayDate` reads it. `toInclusiveEndDay` is its exact inverse: it names the last day a span ending at an instant runs through. The timeline's gantt and `ObjectGantt` both read their ends through the first, so they cannot drift apart again. A day whose OWN midnight does not exist in the viewer's zone (`America/Santiago` on 2026-09-06, which starts at 01:00) now ends at the next day's midnight; the timeline used to end it at 01:00 of that next day. A day whose NEXT midnight does not exist (2026-09-05 there) still ends at the next day's first hour, as it did.
1214
+ - **A drag writes the day the bar runs through.** A dragged or resized bar whose end lands on a day's midnight writes the day before it into a date-only end field, so reading, dragging and writing a stored `2024-01-15` leaves `2024-01-15`. This also holds under a business `timeZone` whose clock skips a midnight. A `datetime` end still writes its instant.
1215
+ - **The view names that day.** `GanttView`'s End column, row date line, tooltip, drag preview and inline editor now name the last day a bar runs through, and the tooltip's day count includes it. Pressing Enter on an untouched row in the inline editor commits the end it started with. An end inside a day still names that day, and a zero-length task still names its own day. An embedder that passes `GanttView` a `Date` end directly now sees that end named as the last day the bar covers. A local-midnight end is named as the day before, which is where its bar already stopped.
1216
+ - With `autoZoomToFilter: false`, the pinned range ends on the last day any task runs through, and no longer adds an empty day column after it.
1217
+ - c1763e5: fix(plugin-gantt): a number row in the gantt tooltip shows the field's declared decimals, and none when it declares none
1218
+
1219
+ A tooltip row over a `number` field (and the `integer`, `float` and `decimal`
1220
+ spellings the tooltip groups with it) always read two decimals, whatever the field
1221
+ declared. A field declaring `scale: 3` read `1.50`, a field declaring `scale: 0` read
1222
+ `1.50`, and a `number` with no `scale` read `1.50` while the list cell for the same
1223
+ value read `1.5`. The row now reads the field's width through `resolveFieldScale`
1224
+ from `@objectstack/spec/data`, as the list cell does. A declared `scale` is that
1225
+ width. A field with no `scale` shows the value as stored (`1.5`, `12`, `7`), because
1226
+ the protocol gives these types no default width.
1227
+
1228
+ Only the decimals change. The row still uses the display locale, and it still groups
1229
+ thousands as before.
1230
+ - b149617: fix(plugin-gantt): a percent row in the gantt tooltip shows the field's declared decimals
1231
+
1232
+ A tooltip row over a `percent` field declaring `scale: 2` read whole percents
1233
+ (`12%`) while the list cell for the same value read `12.34%`. The row now reads
1234
+ the field's width through `resolveFieldScale` from `@objectstack/spec/data`, as
1235
+ the list cell does. A percent that declares no `scale` is unchanged.
1236
+
1237
+ `@object-ui/plugin-gantt` raises its `@objectstack/spec` floor to `^17.5.0`,
1238
+ the first release exporting `resolveFieldScale`.
1239
+ - 31987bd: Three more reader sites stop riding `BaseSchema`'s index signature (objectui#11355 round 2, part of the preparation for objectui#8347's removal of that signature). None changes runtime behaviour.
1240
+
1241
+ **`ActionBarSchema`, the `action:bar` node, is now exported by `@object-ui/types`.** It used to be declared in `@object-ui/components`' `renderers/action/action-bar.tsx`, which is not on that package's entry, so a host could not import it. It now lives in `@object-ui/types`' `ui-action.ts`, beside `UIActionSchema`: `actions` and `systemActions` are `UIActionSchema[]`, and `location` is `@objectstack/spec`'s `ActionLocation`. It declares no `[key: string]: any`, so a literal typed `ActionBarSchema` may write only its declared members, which are the keys the renderer reads. The renderer imports it from `@object-ui/types`, and its parameter annotation keeps its own index signature for the DOM pass-through (objectui#4422). `@object-ui/components` adds no export.
1242
+
1243
+ **`ObjectChartSchema.isAnimationActive?: boolean` is declared on the TypeScript face.** Code sets it `false` for a render with no entrance animation: `DashboardRenderer` and `DashboardGridLayout` on the `object-chart` nodes they build, and `DatasetWidget` and `DatasetReportRenderer` on the nodes they hand the `chart` registration. `ChartRenderer` honours it. The zod mirror declares no member for it, so it is not an authoring key; `zod-mirror-parity.test.ts` files it as runtime-only.
1244
+
1245
+ **Typed where they stand.**
1246
+
1247
+ - `@object-ui/app-shell`: the list-toolbar `action:bar` nodes in `EnvironmentListToolbar`, `InterfaceListPage` and `ObjectView` are built as `ActionBarSchema` values before they reach `SchemaRenderer`.
1248
+ - `@object-ui/plugin-gantt`: `ObjectGantt`'s dev warning about flat gantt keys that a `gantt` block shadows reads those keys off `ObjectGanttSchema`, which declares every one, instead of through a `Record` conversion.
1249
+
1250
+ **minor, not patch, for `@object-ui/types`.** `ActionBarSchema` is a new export, and `isAnimationActive` is a new member in the shipped `.d.ts`.
1251
+ - 4a1adb7: The schedule-conflict and auto-schedule dialogs' task counts read the right noun form in every language at every count (objectui#11445): `gantt.conflict.body`, `gantt.autoScheduleDlg.body` and `gantt.autoScheduleDlg.skipped` are i18next count families, so German no longer reads `1 betroffene Vorgänge` and Russian reads `3 задачи`. The provider-less fallback reads a family's `_one` / `_other` row for a numeric `count`.
1252
+ - f560ded: The gantt tooltip's `percent` row scales at the storage the field declares
1253
+ (`percentCellScale`, the spec's `percentScaleOf`), the answer the list cell
1254
+ reads. A fraction-stored `1` now reads `100%`, where the old magnitude guess
1255
+ read `1%` (objectui#11475).
1256
+ - 39f4309: Published typings from every `vite-plugin-dts` package now carry an explicit extension on
1257
+ every relative specifier, and a type error in the declaration build now fails the build
1258
+ instead of being printed and ignored (objectui#5439, objectui#5483).
1259
+
1260
+ **Consumers on `moduleResolution: nodenext` or `node16` may see NEW type errors, and that
1261
+ is the fix working.** These packages re-export mostly through NAMED re-exports —
1262
+ `export { useObjectChat } from './useObjectChat'`. TypeScript could not follow the
1263
+ extensionless hop, but it still DECLARED the name, so the symbol resolved to a silent
1264
+ `any`. Nothing errored; consumers simply got no types. With the extension emitted, the
1265
+ symbol carries its real type, and any call site that was relying on the `any` now type
1266
+ checks for the first time. This is the mode that produced the 21 residual `TS7006` on
1267
+ `@object-ui/app-shell` reported against objectui#5365 — a type hole that opened quietly,
1268
+ unlike objectui#5365's own `export * from './ui'` packages where the same defect surfaced
1269
+ immediately as `TS2305: has no exported member`.
1270
+
1271
+ 410 extensionless relative specifiers across 19 packages were emitted before this change;
1272
+ the count is now 0 in all 22 packages that build typings through `vite-plugin-dts`.
1273
+ `@object-ui/fields` was already clean — its sources write explicit `.js` specifiers — and
1274
+ is wired so it stays that way.
1275
+
1276
+ The second half changes no emitted output today: 22/22 packages built green unmodified, so
1277
+ making the declaration step's exit code honest turns nothing red. It changes what a FUTURE
1278
+ regression does — print and exit 0, versus fail the build.
1279
+ - 9b61cf1: The package README stops documenting a `navigation` key the spec refuses, and the corrected example is now parsed by the schema that validates it.
1280
+
1281
+ `README.md`'s record-navigation override read
1282
+ `{ mode: 'page', basePath: '/console/apps/.../campaign' }`. `basePath` is not a
1283
+ member of the spec's `NavigationConfig`, and nothing consumes it:
1284
+ `useNavigationOverlay` — where a gantt's `navigation` lands — builds no URL out
1285
+ of the config, and `ObjectGantt` calls the hook with no `onNavigate`, so a
1286
+ page-mode click falls through to the host's `onRowClick`. The destination route
1287
+ is owned by the host and was never authorable through this key, under any
1288
+ spelling.
1289
+
1290
+ That made the snippet worse than inert. `NavigationConfigSchema` is a strict
1291
+ object with no passthrough, so the undeclared key did not fall away quietly — it
1292
+ rejected the **whole** config with `unrecognized_keys`, taking down the
1293
+ `mode: 'page'` the sentence was actually teaching. An author who copied the
1294
+ documented snippet got a rejected navigation config and no page navigation, which
1295
+ is the copy-the-snippet-get-rejected shape objectui#5057 / #5012 named on other
1296
+ keys.
1297
+
1298
+ The example is corrected to `{ "navigation": { "mode": "page" } }` — the shape
1299
+ the sentence demonstrates — and the prose now says who owns the destination route
1300
+ and points at `@objectstack/spec`'s `NavigationConfigSchema` for the member list
1301
+ instead of restating it, matching the derivation `ObjectGanttSchema.navigation`'s
1302
+ doc comment (objectui#5903) adopted for the same concept.
1303
+
1304
+ `view` is **not** substituted for `basePath`. It is a declared member, but it
1305
+ names a form view (the spec: *"Name of the form view to use for details"*) and is
1306
+ forwarded to `onNavigate` as the action argument — it is not a route, so putting
1307
+ it where `basePath` stood would have replaced an invented key with a wrong one.
1308
+ It is documented for what it does.
1309
+
1310
+ No gate in this repo could have caught the original defect, and that is why the
1311
+ fix ships with a measurement rather than a re-reading: `check-doc-snippet-types`
1312
+ compiles `ts`/`tsx` fences and `check-doc-component-types` reads `type` literals,
1313
+ and both are structurally blind to a metadata key in a README — the former's own
1314
+ header records schema-key validity as "a different question … left unruled on
1315
+ purpose". `src/readme-navigation-example.test.ts` closes that hole for this
1316
+ example by EXTRACTING the fence from the README on every run and parsing it
1317
+ against `NavigationConfigSchema`, with a control asserting the same parse still
1318
+ rejects an undeclared key by name, so the green cannot come from a schema that
1319
+ accepts everything.
1320
+
1321
+ `tsconfig.test.json` names `node` in `types` for that test to compile, and its
1322
+ comment — which had recorded that no test in this package touches a Node global
1323
+ — is corrected rather than left standing.
1324
+
1325
+ **Dated note, 2026-10-01 (objectui#11168 slice 4).** Two sentences above describe a README that has since moved. objectui#7334 (same release) gave `ObjectGantt` its own `onNavigate`, so a `page` click no longer falls through to a host handler: the gantt navigates to the record-page address it derives from the page it is on, and no `navigation` member authors that address, `basePath` included. The README example is now the authored node, with `{ "mode": "page" }` inside its `properties` bag, and the prose says where that address leads. The rest of this entry is kept as the reading of this change.
1326
+ - cbc8839: `ObjectGantt`'s export filename resolves a locale-map `label` instead of stringifying it
1327
+ (objectui#6052). A gantt authored as
1328
+ `{ "type": "object-gantt", "objectName": "task", "label": { "en": "Shift Plan", "zh-CN": "排班计划" } }`
1329
+ exported its PNG/PDF as `[object Object]-20260825-1030.png`.
1330
+
1331
+ `BaseSchema.label` is `string | I18nLabel` since #4580's revised Q1-A ruling — `I18nLabel`
1332
+ being the spec's INLINE locale MAP — and the `exportFileName` chain handed that value
1333
+ straight to `String(...)`. It now goes through `resolveI18nLabel` from `@objectstack/spec/ui`,
1334
+ the producer's own resolver for that vocabulary, against the display locale the file already
1335
+ reads via `useDisplayLocale()`. A zh-CN audience gets `排班计划-<stamp>.png`, an en audience
1336
+ `Shift Plan-<stamp>.png`, and a plain-string label is unchanged.
1337
+
1338
+ The next link in the same chain, `objectSchema?.label`, is deliberately left alone: that is
1339
+ the DATA object's label, declared `z.string().optional()` on the spec's `ObjectSchemaBase`,
1340
+ which is a `strictObject` — a locale map there is rejected by the producer rather than
1341
+ resolved by the consumer, and wrapping it would be accepting a second vocabulary at a read
1342
+ site. No filename sanitisation is added either; `GanttView` already strips
1343
+ filesystem-hostile characters downstream, and a resolved map entry goes through the same
1344
+ strip a plain string does.
1345
+ - 45a9aeb: `ObjectGanttSchema.dependencyField` is now marked `@deprecated` on both published
1346
+ declaration faces, naming `dependenciesField` as the canonical spelling
1347
+ (objectui#6470). Nothing is removed and nothing is rejected that was accepted
1348
+ before.
1349
+
1350
+ **What the two spellings were.** `ObjectGanttSchema` declares both, and
1351
+ `getGanttConfig`'s flat branch reads them with a `||`:
1352
+ `dependenciesField: schema.dependenciesField || schema.dependencyField`.
1353
+ `dependenciesField` is the spec's key (`@objectstack/spec`
1354
+ `GanttConfigSchema.dependenciesField`); the singular `dependencyField` has NO
1355
+ spec counterpart — zero occurrences across `packages/spec/src`, measured against
1356
+ a live positive control on the plural. Until objectui#6051 declared the plural,
1357
+ the singular was the ONLY dependencies spelling this interface carried, so for
1358
+ the whole time the alias existed the published type taught the non-spec key and
1359
+ hid the canonical one.
1360
+
1361
+ **What was missing was the ranking, not the behaviour.** The two were declared as
1362
+ equals: nothing on either face said which one to author, so a reader — including
1363
+ an AI writing metadata, which is the reader this project optimises for — had a
1364
+ coin flip between a spec key and pre-spec vocabulary. The marker turns that coin
1365
+ flip into a fact the type itself carries, and the zod mirror's description makes
1366
+ it readable at runtime as well as in an editor.
1367
+
1368
+ This adopts the idiom already ruled for this exact shape rather than inventing a
1369
+ second one: `KanbanConfig`'s pre-#2231 aliases (`groupField`, `cardFields`) carry
1370
+ `/** @deprecated legacy alias for the spec's X */` plus
1371
+ `.describe('Deprecated alias for X')`, and `dependencyField` now reads the same
1372
+ way.
1373
+
1374
+ **⛔ Not a removal, deliberately.** Deleting the alias — or narrowing the
1375
+ renderer's `||` — would break every author who wrote the singular and narrow the
1376
+ accept set of a published surface. That is a maintainer decision on a future
1377
+ enforce-or-remove card once the deprecation has sat a release, and it is
1378
+ explicitly excluded here. Two pins hold the line in both directions:
1379
+ `packages/types/src/__tests__/gantt-dependency-field-deprecated-alias.test.ts`
1380
+ fails if the marker goes missing AND if the alias stops being declared or
1381
+ accepted, and `packages/plugin-gantt/src/ObjectGantt.dependencyAlias.test.tsx`
1382
+ fails if the `||` limb is dropped — the two spellings must keep resolving to the
1383
+ same config, with the canonical one winning when both carry a value.
1384
+
1385
+ `packages/plugin-gantt/README.md`'s `ObjectGanttSchema` example authored the
1386
+ singular; it was the only in-repo site that did, and it now authors the plural
1387
+ with the alias named as legacy. No runtime code, fixture, example app or catalog
1388
+ schema authored it.
1389
+ - f9653ae: Re-key the load-bearing fetch effects in `ObjectMap`, `ObjectCalendar` and
1390
+ `ObjectGantt` onto the primitive fields they actually read off `dataConfig`
1391
+ (`provider` / `object` / `items`) instead of the whole memoised `dataConfig`
1392
+ object (objectui#6592, the deferred half of objectui#6270/PR #6591).
1393
+ `ObjectTree` is a census member too but is deferred out of this change — see
1394
+ the PR body — because its own fetch effects are the surface of PR #6696
1395
+ (objectui#6481), open at the same time.
1396
+
1397
+ `useMemo` carries no semantic guarantee — React is permitted to discard a
1398
+ memo cache and recompute even when its dependency array compares equal to
1399
+ the previous render, and the local `getDataConfig(schema)` helper each of
1400
+ these renderers carries builds a fresh `{ provider, object }` /
1401
+ `{ provider, items }` wrapper object on every call. So a fetch effect keyed
1402
+ on `dataConfig` itself was correct only for as long as that identity
1403
+ happened to survive a discard: a recompute alone (no author or caller
1404
+ action) was enough to re-run the effect and issue an extra
1405
+ `dataSource.find` / `dataSource.getObjectSchema` call. Keying the effects
1406
+ on the primitives instead makes a cache discard a no-op, restoring
1407
+ `useMemo` to a pure optimisation.
1408
+
1409
+ `ObjectGantt`'s `effectiveDataSource` memo deliberately keeps `dataConfig`
1410
+ as a dependency (`resolveDataSource` needs the whole provider-shaped
1411
+ value — the `api` provider's `read`/`write` request config cannot be
1412
+ flattened to a fixed primitive list the way `object`/`value` can), so its
1413
+ `reload()` fetch is decoupled from the redundant direct `dataConfig`
1414
+ dependency but not from `effectiveDataSource`'s own; for the `object`/`value`
1415
+ providers `resolveDataSource` returns its `fallback`/a fresh
1416
+ `ValueDataSource` respectively rather than reading further into the config,
1417
+ which is enough for the two fetch effects to observe no extra call under a
1418
+ recomputed-but-equivalent `dataConfig` in the common case.
1419
+
1420
+ No behaviour change for a schema whose `useMemo` caches survive normally;
1421
+ the effects are unaffected by React discarding one.
1422
+ - 3beef6d: The spec's `dataSource` element binding is now DECLARED by the blocks that read
1423
+ it, so the html tier stops reporting the one working saved-view spelling as
1424
+ `unknown-prop` (objectui#6678).
1425
+
1426
+ `PageComponentSchema.dataSource` — `{ object, view, filter, sort, limit }` — is
1427
+ the one spelling that resolves a saved view for an object-bound block. It works,
1428
+ and it drew the identical `unknown-prop` warning as the two spellings that do
1429
+ nothing (`viewName`, `view`), because `validateTree` looks a prop up in the
1430
+ block's declared `inputs` and no registration declared this key. On the tier
1431
+ built to accept AI-authored pages, where the diagnostic IS the contract, the
1432
+ only signal pointed away from the key that works.
1433
+
1434
+ Adopting the maintainer ruling of 2026-08-29 — option B **in the injection
1435
+ form**:
1436
+
1437
+ - `ELEMENT_DATA_SOURCE_INPUT` is the single declaration, in `@object-ui/core`
1438
+ beside the binding's own semantics; `Registry.register` emits it for any
1439
+ registration whose renderer passed through the new `elementDataSourceBlock()`
1440
+ seam. One mechanism, one copy — not a hand-kept declaration per block, which is
1441
+ the shape that drifts and that a new block forgets. The seam lives in
1442
+ `@object-ui/core` and is re-exported by `@object-ui/react` beside
1443
+ `ElementDataSourceGate` for discoverability; call sites take the core import,
1444
+ because a registration runs at module scope and this repo's suites partially
1445
+ mock `@object-ui/react`.
1446
+ - Seventeen renderers, in thirteen files across twelve packages, reach the seam
1447
+ and now publish the key to the save gate, the parser whitelist, the generated
1448
+ JSX authoring types and the block list. The card named nine blocks; the tree
1449
+ also has `plugin-grid`, `plugin-timeline`, two further `plugin-form` blocks and
1450
+ `element:record_picker` — nothing was hand-listed, so the mechanism covered
1451
+ them. `element:record_picker` consumes the gate's HOOK and status panels rather
1452
+ than the wrapper tag (its object lives under `properties`), and was found by a
1453
+ render probe rather than by reading sources.
1454
+ - `dataSource` on a block that does NOT read it (`flex`, `card`) still reports
1455
+ `unknown-prop`. Adding the key to `sdui-parser`'s `BASE_PROPS` was refused for
1456
+ exactly this reason — that set mirrors `BaseSchema`, and silencing the key
1457
+ everywhere would make the diagnostic lie in the other direction.
1458
+ - New `check:element-data-source-declaration` fails any source that consumes the
1459
+ gate without reaching the seam, so a block added tomorrow cannot forget.
1460
+
1461
+ Behaviour of the binding itself is unchanged — this is a declaration, not a
1462
+ resolution change. The saved view still resolves its columns, and an
1463
+ unresolvable `view` still fails loudly rather than widening to the object's full
1464
+ scope.
1465
+
1466
+ The spec/registry parity gates (repo-wide and the `record:related_list` per-block
1467
+ pin) now derive their accepted set from the WHOLE node contract rather than from
1468
+ `ComponentPropsMap[type]` alone. `PageComponentSchema` accepts and keeps
1469
+ `dataSource` on a page-component node — it is a node-level key, a sibling of
1470
+ `type` and `className`, not a per-block prop — so the gates' previous complaint
1471
+ was measurably wrong. Derived from the spec, not exempted, and both still
1472
+ discriminate against an invented key.
1473
+ - 231d1b9: Gantt toolbar: the period label names the visible window, and the prev/next
1474
+ buttons step it (objectui#7203).
1475
+
1476
+ The label formatted `timelineRange.start` — the memo spanning the whole dataset
1477
+ — so it named the first unit of the entire result set and could not change while
1478
+ the chart was scrolled, because it was not derived from scroll position at all.
1479
+ On a dataset running January to December it therefore read "January 2026" at
1480
+ every scroll position, four pixels above a band header correctly reading
1481
+ "Aug 2026". Measured on the demo fixture in Chromium at 1440x900: on first paint,
1482
+ after the chart auto-scrolls to Today, the label read `December 2025` over
1483
+ columns `28F 29S 30S 31M 1T 2W 3T` with the band beneath them reading `Aug 2026`.
1484
+ Two month labels four pixels apart, disagreeing — and the wrong one is the
1485
+ prominent one, so the chart reads as if the columns were mislabelled.
1486
+
1487
+ The label now names the period at the left edge of the viewport, snapped to the
1488
+ same tier `headerGroups` bands the timeline by: a month under day and week view,
1489
+ a year under month and quarter view, a decade under year view, the shift-day
1490
+ under shift-segmented day view. The toolbar and the band header therefore agree
1491
+ by construction rather than by two derivations that can drift. Wording is
1492
+ unchanged for the month tier — the toolbar still spells the month out
1493
+ ("August 2026" beside the header's "Aug 2026").
1494
+
1495
+ The `‹` / `›` buttons rendered an `aria-label` and an icon and carried no
1496
+ `onClick`. They now scroll the visible window one period backwards/forwards at
1497
+ that same tier, clamped to the ends of the timeline (ADR-0049 enforce-or-remove:
1498
+ wiring is the branch the label change makes available). They step the label's
1499
+ tier rather than one column, so a click always changes what the label says.
1500
+
1501
+ The band header is untouched. It was already correct; it is the reference here.
1502
+ - 7c3df8f: The settled-schema convergence, and the gantt's duplicate query gated
1503
+ (objectui#7225, maintainer ruling B, 2026-09-02).
1504
+
1505
+ `useSettledSchema` was extracted and published in PR #6690 with exactly **one**
1506
+ non-test adopter (`ObjectTree`, the component that had an actual defect —
1507
+ objectui#6481's unkeyed latch). `ObjectKanban`, `plugin-view/ObjectView` and
1508
+ `ObjectCalendar` kept their own hand copies of the same shape, so a published
1509
+ export was owed compatibility forever **and** the duplication it was named for
1510
+ stayed. All three now call the hook.
1511
+
1512
+ The migration is a pure deduplication with no behaviour delta — the hook was
1513
+ extracted *from* these three shapes, so each becomes a one-line call.
1514
+ `ObjectCalendar`, which objectui#6482 named as the obstacle, fits via the
1515
+ recipe the hook's own doc comment prescribes for it by name: pass the data
1516
+ source as `undefined` for a render that must not read metadata
1517
+ (`hasInlineData ? undefined : dataSource`), so "inline value data set" is
1518
+ expressed as "there is no source to read from" rather than as a second enable
1519
+ flag. GATE PLACEMENT stays local in all three, which is what #6482 ruled and
1520
+ what made the calendar's obstacle a non-obstacle: it was about the gate half.
1521
+
1522
+ **One observable change:** `ObjectKanban`'s rejected definition read now logs
1523
+ on `console.error` with a `[useSettledSchema]` prefix instead of
1524
+ `console.warn`. Its test spy moves with it, and now asserts on the channel
1525
+ rather than merely silencing it.
1526
+
1527
+ **The gantt's duplicate query is gated** (ask 2 of the card; #6482's
1528
+ undischarged half). `ObjectGantt` listed `objectSchema` in `reload`'s
1529
+ dependency list, so every load issued two unbounded queries — the first with no
1530
+ `$expand` at all. Measured on this component across three latency profiles, the
1531
+ cost is not the mild "round trip bought and thrown away": when the metadata
1532
+ read is the slower of the two, which is the common case on a cold
1533
+ `MetadataCache`, the user sees the full three-step paint — raw foreign-key ids,
1534
+ back to the loading placeholder, then the expanded rows. It now issues one
1535
+ query, already expanded.
1536
+
1537
+ Gating the gantt required its schema resolution to settle on EVERY exit
1538
+ (objectui#7232): the hand-rolled effect returned without settling on
1539
+ `!effectiveDataSource`, on `!resource` and in its `catch` — harmless while
1540
+ nothing waited on it, and a chart that never loads once something does.
1541
+ `useSettledSchema` settles on all three by construction, which is what makes
1542
+ the gate safe; both exits are pinned.
1543
+
1544
+ ⛔ Gating is not capping. The row ceiling on these fetches is objectui#7210's
1545
+ separate ruling, in its own commit on the same branch.
1546
+ - 6411def: FLS-gate the `$expand` projection at the five remaining build sites (objectui#7230).
1547
+
1548
+ objectui#7215 / PR #7229 gated `$expand` at the two projection sites in its scope
1549
+ (`ObjectGrid`, `ListView`). The helper is reached from more places than that. This
1550
+ closes the five that were left: `ObjectCalendar`, `ObjectGantt`, `RecordDetailView`,
1551
+ `DetailView`, and `ObjectDataTable` (which builds its own whitelist in
1552
+ `computeLookupExpand` rather than calling `buildExpandFields`).
1553
+
1554
+ **Three of them pass no column list at all**, which makes them the sharp ones:
1555
+ `buildExpandFields` reads an absent column list as "no column restriction" and falls
1556
+ back to **every declared relation on the object**, denied ones included. So a standalone
1557
+ calendar, a gantt, and every record page in the console asked the server to resolve the
1558
+ object's full relation set by default rather than by configuration.
1559
+
1560
+ **`DetailView` was input-gated, and that is the defect rather than the fix.** Its column
1561
+ list is already FLS-filtered field by field, which is exactly the route PR #7229 measured
1562
+ as unsound: an emptied column list reads as "no column restriction", so a detail view
1563
+ whose authored fields are all denied had its `$expand` **widened** from the relations it
1564
+ asked for to every relation the object declares. The principal who may read least was
1565
+ asking for the most.
1566
+
1567
+ **Reproduced before it was fixed**, as a failing test per site.
1568
+
1569
+ **Grading, measured rather than assumed.** Against ObjectStack's own server this is
1570
+ defence-in-depth, exactly as objectui#6898 and #7215 are: `plugin-security`'s
1571
+ `FieldMasker.maskRecord` deletes every unreadable key from each returned row and
1572
+ objectql's expand path writes the resolved record back under that same key, so one
1573
+ statement removes the expanded object and the bare id alike; the expansion sub-read is
1574
+ itself gated (`__expandRead` takes the referenced object's full CRUD + RLS + FLS
1575
+ treatment). It is load-bearing for any backend that does not strip, and the
1576
+ client-request side is real regardless.
1577
+
1578
+ **Nothing a permitted view did stops working.** The gate judges each helper's OUTPUT,
1579
+ which contains only the object's declared reference-bearing fields, so the "`checkField`
1580
+ answers false for an undeclared key" trap cannot be reached and derived / host-joined
1581
+ columns are untouched. An unanswered permission policy filters nothing. Neither
1582
+ `buildExpandFields` nor `computeLookupExpand` is changed.
1583
+ - 92c65aa: `ObjectGantt` no longer blanks the chart when one reload supersedes another
1584
+
1585
+ `reload()` already sequenced concurrent runs with `reloadSeqRef` and guarded every
1586
+ result write with `isCurrent()`, but its `finally` was unguarded — so a **superseded**
1587
+ reload still flipped `loading` / `refreshing` off. The stale run only had to finish
1588
+ first, which is the ordinary case whenever a second reload is issued while the first
1589
+ is still in flight: the placeholder was released, no rows had arrived, and the user
1590
+ saw an empty chart until the fresh response landed.
1591
+
1592
+ The `finally` now clears the flags only when the run reaching it is still the current
1593
+ one. It clears **both** flags rather than only the one its own `silent` mode set:
1594
+ being current at that point means nothing is in flight any more, so clearing only its
1595
+ own mode would strand the other flag whenever the superseded run used the other mode
1596
+ — a silent toolbar refresh overtaken by a filter-change reload would have left the
1597
+ refresh button busy for the life of the component.
1598
+
1599
+ This is the reload guard alone. Nothing about which queries are issued, how they are
1600
+ projected or how they page changes.
1601
+ - e75f4c9: `colorField` now means the same thing in the gantt, the calendar and the timeline
1602
+ (objectui#7243).
1603
+
1604
+ **The inversion this fixes.** `gantt.colorField` is documented as "field that drives the
1605
+ bar color", and the renderer passed the stored value straight into the bar's
1606
+ `backgroundColor`. Pointing the key at a select field therefore emitted
1607
+ `backgroundColor: "open"` — not a colour, so the browser dropped the declaration and
1608
+ every bar rendered identically. OMITTING the key was strictly better: the absent-key
1609
+ branch derived a real colour per status. Declaring the documented key was worse than not
1610
+ declaring it, with no error, warning or console message either way.
1611
+
1612
+ The same key also meant three different things across the three lenses: the timeline
1613
+ resolved the field's authored option `color`, the calendar hashed the raw value onto a
1614
+ fixed palette, and the gantt emitted the raw value. An author colouring three views by
1615
+ one field got three unrelated results, one of which was no colour at all.
1616
+
1617
+ **The ladder.** `@object-ui/core` gains `createFieldColorResolver` — the timeline's
1618
+ resolver, lifted so all three call it:
1619
+
1620
+ 1. the field's own option `color` for the record's value;
1621
+ 2. else the value itself when it already IS a colour literal (`#rgb`, `#rrggbb`,
1622
+ `#rrggbbaa`, `rgb(...)`, `hsl(...)`);
1623
+ 3. else each renderer's own last rung, which is deliberately NOT shared — the gantt
1624
+ derives a semantic-token hex (a bar must be painted), the calendar keeps its
1625
+ theme-aware 8-stop hash (a soft tint, not a solid fill), the timeline draws its
1626
+ default marker.
1627
+
1628
+ **What changes for authors.** A gantt or calendar whose `colorField` points at a select
1629
+ field with authored option colours now paints those colours. A gantt value that is
1630
+ neither an option colour nor a colour literal now derives a colour instead of emitting
1631
+ an invalid CSS value — including a palette NAME (`red`), which now resolves to that
1632
+ palette's hex, the behaviour the key's own contract has always promised ("hex or
1633
+ semantic name") and the one `borderColorField` already had. `gantt.borderColorField`
1634
+ takes rung 1 as well, so an authored option colour reaches the alert stroke; it keeps
1635
+ today's behaviour otherwise and deliberately gains no derivation rung, since the stroke
1636
+ is opt-in and deriving one for every record would draw an alert on records that have
1637
+ none.
1638
+
1639
+ Calendars whose `colorField` points at a plain categorical field are unchanged: that
1640
+ value still reaches `CalendarView`'s deterministic hash exactly as before. The timeline
1641
+ is unchanged apart from accepting the 8-digit `#rrggbbaa` hex spelling the calendar
1642
+ already accepted.
1643
+ - 67d4ed9: `ObjectGantt` no longer treats an EMPTY host `data` array as the rows it was handed (objectui#7333).
1644
+
1645
+ `ObjectGantt` read a host `data` prop at two places, and both accepted `[]`. The
1646
+ reload's short-circuit tested `data && Array.isArray(data)`, and an empty array
1647
+ is truthy, so the chart adopted it and returned before its own query. The gating
1648
+ flag tested `Array.isArray(data)` alone, so the same array also switched off the
1649
+ object-schema gate and the data-invalidation subscription of that query. A gantt
1650
+ whose `data` names its own source, for example `{ provider: 'api', read }`,
1651
+ therefore painted an EMPTY chart whenever a host handed it an array it had not
1652
+ filled yet.
1653
+
1654
+ Both places now read one predicate. A host `data` array is adopted only when it
1655
+ has rows. An empty one reads as "no host rows yet": the chart queries its own
1656
+ source, exactly as it does with no host array at all, and adopts the host's rows
1657
+ when they arrive.
1658
+
1659
+ Who can reach this: the registered `object-gantt` renderer still forwards no
1660
+ host prop, and `ObjectGanttProps` does not declare `data`, so only a caller that
1661
+ renders `ObjectGantt` directly and spreads `data` in was affected.
1662
+ - 2c878be: Honour a gantt view's authored `navigation` — forward it down the gantt
1663
+ view-schema path, and give the component a destination for the non-overlay
1664
+ modes (objectui#7334).
1665
+
1666
+ **Leg 1, `@object-ui/plugin-list`.** `ObjectGantt` resolves
1667
+ `schema.navigation ?? { mode: 'drawer' }` and classifies four overlay modes
1668
+ (`drawer` / `modal` / `split` / `popover`). Nothing ever put `navigation` on the
1669
+ node it receives — `ListView`'s shared `baseProps` declares no such key and the
1670
+ `case 'gantt'` branch added only the data keys — so that fallback was the only
1671
+ branch ever taken. A gantt view authoring `navigation: { mode: 'page' }` (or
1672
+ `modal`, or `split`) opened a drawer instead, with no diagnostic. The key was
1673
+ already authorable and already read; this restores declared = enforced. No new
1674
+ authorable key is added.
1675
+
1676
+ The key is forwarded on the `case 'gantt'` branch and deliberately **not** on
1677
+ the shared `baseProps`, because every other child view resolves this same
1678
+ question through the `onRowClick` that `baseProps` already carries:
1679
+ `ObjectGrid`, `ObjectGallery`, `ObjectKanban`, `ObjectMap`, `ObjectTimeline` and
1680
+ `ObjectTree` hand that callback to `useNavigationOverlay` unconditionally, and
1681
+ the hook gives an external `onRowClick` full priority over any `navigation` — so
1682
+ on `baseProps` the authored config would arrive there only to be outranked.
1683
+ `ObjectCalendar` is the one that would genuinely change behaviour: it mirrors
1684
+ gantt's `navIsOverlay ? undefined : onRowClick`, so an authored non-overlay mode
1685
+ would stop it suppressing the host handler. Gantt is the only branch where
1686
+ forwarding settles the question rather than splitting it, because its wrapper
1687
+ drops host props entirely (objectui#7210 / objectui#7222) and there is no
1688
+ `onRowClick` there to outrank anything.
1689
+
1690
+ **Leg 2, `@object-ui/plugin-gantt`.** `ObjectGantt` now supplies its own
1691
+ `onNavigate`, so a click under an authored `page` or `new_window` actually
1692
+ reaches the record page. Leg 1 alone would have made `page` reachable and inert:
1693
+ `useNavigationOverlay`'s `page` branch calls `onNavigate` and returns with no
1694
+ fallback, this component supplied none, and its registration hands it no host
1695
+ `onRowClick` either — both carriers empty at once, turning an authored `page`
1696
+ from "a drawer opens, which is wrong" into "the click does nothing". The
1697
+ destination is the record-page href the component already computes for the
1698
+ drawer's full-page link, so the two cannot diverge; same-tab navigation uses the
1699
+ history plus `popstate` pair (matching `DashboardRenderer` and `PageHeader`),
1700
+ and `new_window` now opens the app-prefixed href rather than the hook's
1701
+ unprefixed fallback. No host prop is forwarded to the chart.
1702
+
1703
+ A view that authors no `navigation` still gets **no** key and still opens its
1704
+ drawer, so the component's default is unchanged for every gantt in the product
1705
+ today; an authored `none` stays inert.
1706
+ - 3ef0b51: fix(plugin-map, plugin-gantt): the registrations no longer declare `objectName` a required input
1707
+
1708
+ Both renderers read their records from one of three keys (`data`, then
1709
+ `staticData`, then `objectName`), and the `object-map` / `object-gantt` zod schemas
1710
+ enforce "one of the three" through `requireRecordSource` (`77cb489b4`). The
1711
+ registrations' designer-facing `inputs` still said `objectName` was required, on
1712
+ `object-map`, `map` and `object-gantt`, so the html tier's validator reported a
1713
+ `missing-required-prop` error on a block authored on `staticData` or `data` that
1714
+ the schema accepts and the renderer draws.
1715
+
1716
+ `objectName` is now declared without `required`, and its description states the
1717
+ rule: the record source is one of `data`, `staticData` and `objectName`, and the
1718
+ schema refuses a block that declares none of them. No one-of form was added to the
1719
+ input declaration; the zod refinement stays the place that enforces it. The
1720
+ renderers' read order is unchanged. The `@object-ui/plugin-gantt` README sentence
1721
+ that called `objectName` required is corrected (objectui#7470).
1722
+
1723
+ **Correction, 2026-10-01 (objectui#11117).** The rule this entry describes gained an exception:
1724
+ the `object-map` and `object-gantt` schemas also accept a block that declares none of the three
1725
+ when its `dataSource.object` names the object, because the registration's `ElementDataSourceGate`
1726
+ lands that name on `objectName`. The `objectName` input description now says so.
1727
+ - c6198c2: **Breaking for authored metadata:** `ComponentInput.label`, `ComponentInput.defaultValue` and
1728
+ `ComponentInput.advanced` are RETIRED on both faces (objectui#7493 item ① and objectui#7781;
1729
+ maintainer ruling A of 2026-09-06, immediate, no deprecation window; ADR-0049 enforce-or-remove).
1730
+ They are the three keys the manifest serializer does not forward, and nothing read them on any
1731
+ publication or consumption path.
1732
+
1733
+ No manifest ever published them, so no consumer could ever have read them. `sdui-parser`'s
1734
+ serializer (`packages/sdui-parser/src/index.ts`) forwards exactly seven keys per input — `name`,
1735
+ `type`, `of`, `required`, `enum`, `binding`, `description` — so a value authored under any of the three
1736
+ never reached `sdui.manifest.json`, the generated JSX `.d.ts`, or a diagnostic; its boundary type
1737
+ has no slot for them; the registry's data-source seam reads `name` only; and neither the designer
1738
+ nor the app-shell inspectors consult registry `inputs` at all. A structural census over every
1739
+ `inputs:` array in the repository (re-measured on this change's merge-base, `name` 951 and `type`
1740
+ 951 as the controls) counted the writes: `label` 908, `defaultValue` 245, `advanced` 9 — written on
1741
+ nearly every registration, read by nothing.
1742
+
1743
+ FROM → TO, per key — all three **TOMBSTONED, not removed**, because the route was measured on
1744
+ the built face before it was chosen: `ComponentInputSchema` is a non-strict `z.object`, and an
1745
+ undeclared key parses GREEN and is silently STRIPPED, so a deletion would have swallowed 1,162
1746
+ authored values in silence. The tombstone is what makes the refusal loud and by name.
1747
+
1748
+ - `label?: string` → `label?: never` on the interface, `retirementTombstone()` on the Zod mirror.
1749
+ Migration: delete the key. An input is identified by its `name` on every path that reaches it;
1750
+ nothing ever rendered a label for it.
1751
+ - `defaultValue?: any` → `defaultValue?: never` / `retirementTombstone()`. Migration: delete the
1752
+ key. The renderer's own fallback read IS the default; tell the author about it in `description`,
1753
+ which IS published. (Tightening the type to `unknown` was ruled out: it closes no error class,
1754
+ since nothing reads the value.)
1755
+ - `advanced?: boolean` → `advanced?: never` / `retirementTombstone()`. Migration: delete the key.
1756
+ No designer surface ever hid an "advanced" input; there is nothing to write instead.
1757
+
1758
+ The retirement kit: `?: never` on `ComponentInput` (`packages/types/src/base.ts`), so authoring one
1759
+ is a `tsc` error at the registration site; `retirementTombstone()` on `ComponentInputSchema`
1760
+ (`packages/types/src/zod/base.zod.ts`), so an authored value is REFUSED at parse time with
1761
+ `code: 'invalid_type'`, the key named in the issue `path`, and the migration note as the message
1762
+ (one string, both channels). Pinned in
1763
+ `packages/types/src/__tests__/component-input-retired-keys-7493.test.ts`, which also holds a
1764
+ tree-scoped absence census over every `inputs:` array under `packages/**` and `apps/**`.
1765
+
1766
+ Accept-set change, stated plainly for reviewers: a document that sets any of the three keys on a
1767
+ `ComponentInput` used to parse GREEN (the value was then dropped by the serializer) and now parses
1768
+ RED. Every in-repo authoring site — 1,199 keys across 110 registration files, the three standalone
1769
+ `ComponentInput[]` arrays and the two named input arrays `tsc` found included — is deleted in the same change, as the ruling's split rule
1770
+ requires; the `WidgetRegistry` seam no longer copies the widget-manifest values onto the synthesized
1771
+ `ComponentInput` (they fed nothing), and the data-source declaration `ELEMENT_DATA_SOURCE_INPUT`
1772
+ drops its `label`. The patch entries on the other packages record exactly that: their registrations
1773
+ stop authoring inert keys, with no runtime or published-manifest change.
1774
+
1775
+ The nine test files that read `defaultValue` off a registration were re-pinned against the
1776
+ renderer's ACTUAL default (its own fallback read, or the `defaultProps` it ships) instead of the
1777
+ declaration that went away; two assertions that only restated the shadow default were dropped with
1778
+ the reason on the line.
1779
+
1780
+ The in-repo zero is what was measured. Whether anything OUTSIDE this repository writes these keys
1781
+ is not measurable from here (the objectui#5674 limit); converting such a write from a silent drop
1782
+ into a named refusal is exactly what the tombstones buy. `WidgetInput`'s own `label` /
1783
+ `defaultValue` / `advanced` (the widget-manifest face) stay declared and writable — nothing has
1784
+ ruled on that face; that it now has no reader either is recorded as objectui#7911.
1785
+ - ce2aaef: One shared record-source ladder, five plugins delegate.
1786
+
1787
+ `@object-ui/core` publishes `resolveRecordSourceConfig(schema)` — the ONE implementation
1788
+ of the ruled three-rung record source ladder: `data` first, then `staticData` wrapped as
1789
+ `{ provider: 'value', items }`, then `objectName` folded to `{ provider: 'object' }`, and
1790
+ `null` when nothing is bound. It is the PRODUCER whose output the reader
1791
+ `resolveRecordSourceObjectName` (`b041b9c0c`) consumes, and it now sits beside it in the same module.
1792
+
1793
+ That ladder is published contract on both faces — `packages/types/src/objectql.ts` and its
1794
+ zod mirror both ship `.describe()` strings naming `getDataConfig`'s order (`77cb489b4`,
1795
+ maintainer ruling 2026-09-02), pinned by `objectql-record-source-refinement-6939.test.ts` —
1796
+ and it was hand-copied into five plugin components with no gate holding them together. A
1797
+ change to the ruled order had five edit sites and nothing that noticed a missed one; that
1798
+ is the AGENTS.md #0.1 drift class.
1799
+
1800
+ **No behaviour changes.** `ObjectCalendar`, `ObjectGantt` and `ObjectTree` now call the
1801
+ shared reader directly. `ObjectGrid` and `ObjectMap` keep their own bare-array `data`
1802
+ shorthand as a documented head above the shared call and are otherwise unchanged.
1803
+ `record-source-config.behaviourNeutrality-7632.test.ts` transcribes all five pre-collapse
1804
+ bodies verbatim and asserts the post-collapse spelling agrees with each across the whole
1805
+ input matrix, so a later edit to the shared reader that moves any site turns red.
1806
+
1807
+ **Two divergences were measured rather than assumed, and both are preserved.**
1808
+
1809
+ `ObjectCalendar`'s `'data' in schema && schema.data` guards existed because its parameter was
1810
+ at that time the union `ObjectGridSchema | CalendarSchema`, whose `CalendarSchema` arm declared
1811
+ neither key. (objectui#8651 has since re-pointed that parameter at the published
1812
+ `ObjectCalendarSchema`, so the union is gone; the CONCLUSION below — that the guard had no
1813
+ runtime effect and removing it is behaviour-neutral — is unaffected.)
1814
+ That is a TypeScript narrowing device with no runtime effect — an absent property reads
1815
+ `undefined`, falsy either way — so the guard could never change which rung is taken. The
1816
+ shared reader's optional-property parameter accepts the union directly, and the
1817
+ equivalence is pinned on a fixture that really lacks both keys rather than argued.
1818
+
1819
+ `ObjectGrid` and `ObjectMap` normalize a bare-array `data` to `{ provider: 'value', items }`;
1820
+ `ObjectCalendar`, `ObjectGantt` and `ObjectTree` do not, and return the array verbatim. That
1821
+ is a real divergence on off-contract input — `ViewData` is a discriminated union over object
1822
+ variants, so an array under `data` cannot be published. It is NOT unified here: the shared
1823
+ rung stays contract-strict and the two sites keep the head locally, the same way `b041b9c0c`
1824
+ left the off-contract `{ provider: 'object' }` tails at their sites. Both sides of the fork are
1825
+ pinned, so neither folding the head in nor deleting it as redundant can happen silently.
1826
+
1827
+ `ObjectTree`'s copy took `schema: any`; it now goes through the shared reader's typed
1828
+ parameter. Types are erased at runtime, so nothing it resolves moves.
1829
+ - fb336df: Move `lucide-react` from `^1.31.0` to `^1.43.0` in every package that declares it, and
1830
+ repair what the jump breaks, so icons resolved from a STRING keep drawing a glyph.
1831
+
1832
+ Measured once against the installed 1.43.0 artifact when this change was made; nothing in
1833
+ the repository re-derives these readings. Across the jump lucide removes no runtime export,
1834
+ no public type name and no `lucide-react/dynamic.mjs` name, and every name this repository
1835
+ imports from `lucide-react` resolves. Exactly one key leaves the runtime `icons` record:
1836
+ `Trash2`, retired in favour of `trash`.
1837
+
1838
+ What a user sees change:
1839
+
1840
+ - Icons the lazy icon seam draws (`resolveIcon`, objectui#9251) get their path data again.
1841
+ lucide 1.43.0 icon modules export their path data inside `__iconData` and no longer
1842
+ export `__iconNode`; the seam now reads both. Reading only `__iconNode` against 1.43.0
1843
+ leaves every such glyph an empty box, with nothing thrown or logged.
1844
+ - `DetailView`'s delete action and three schema-catalog examples spell their icon
1845
+ `trash`, not `trash-2`, so they keep resolving. The glyph is unchanged: 1.43.0's `trash`
1846
+ path data is byte-identical to the `trash-2` path data of 1.31.0 and 1.35.0. Anything
1847
+ that already authored `trash` now draws that same artwork, because lucide moved it under
1848
+ the `trash` name; a few other glyphs were also redrawn upstream.
1849
+ - Icons imported as COMPONENTS carry lucide 1.43.0's own classes: one class per declared
1850
+ alias (a spinner renders `class="lucide lucide-loader-circle lucide-loader-2 ..."`), and
1851
+ no longer the class lucide used to derive from the PascalCase key where that differs
1852
+ (`ArrowDown01` no longer carries `lucide-arrow-down01`). The canonical
1853
+ `lucide-<icon name>` class is still there, so a `.lucide-loader-circle` selector still
1854
+ matches.
1855
+ - Icons resolved from a STRING through the seam keep the classes they had: `lucide`, the
1856
+ canonical `lucide-<icon name>` class and the key-derived class. They do not carry
1857
+ lucide's per-alias classes. That is a maintainer ruling (objectui#8941, option C): the
1858
+ alias list lives only inside each lazily loaded icon module, and it was not moved into
1859
+ the eager name list. A selector that targets an alias class matches a component-imported
1860
+ icon and not a string-resolved one. This also dates the example in the objectui#9251
1861
+ entry: `trash-2` no longer resolves as a string, so no seam-drawn glyph carries
1862
+ `lucide-trash2 lucide-trash-2`; a digit-bearing name that still resolves, such as
1863
+ `arrow-down-0-1`, carries `lucide-arrow-down01 lucide-arrow-down-0-1`.
1864
+ - Updated dependencies [cd2cb41]
1865
+ - Updated dependencies [7b10bef]
1866
+ - Updated dependencies [97abedc]
1867
+ - Updated dependencies [b46c58f]
1868
+ - Updated dependencies [a507334]
1869
+ - Updated dependencies [ad694ac]
1870
+ - Updated dependencies [6f96fca]
1871
+ - Updated dependencies [afb2284]
1872
+ - Updated dependencies [3ac2de8]
1873
+ - Updated dependencies [0aacecc]
1874
+ - Updated dependencies [28b0658]
1875
+ - Updated dependencies [63f4f92]
1876
+ - Updated dependencies [777fca2]
1877
+ - Updated dependencies [c131d9e]
1878
+ - Updated dependencies [5f00ff4]
1879
+ - Updated dependencies [c9e073a]
1880
+ - Updated dependencies [0361d6b]
1881
+ - Updated dependencies [7b395d8]
1882
+ - Updated dependencies [0879812]
1883
+ - Updated dependencies [588380d]
1884
+ - Updated dependencies [8cedb0d]
1885
+ - Updated dependencies [162621b]
1886
+ - Updated dependencies [b06c3de]
1887
+ - Updated dependencies [0d379f5]
1888
+ - Updated dependencies [4c6f549]
1889
+ - Updated dependencies [80c5412]
1890
+ - Updated dependencies [6cc910b]
1891
+ - Updated dependencies [061f5e8]
1892
+ - Updated dependencies [879ecac]
1893
+ - Updated dependencies [c2dabf0]
1894
+ - Updated dependencies [2dd4d3f]
1895
+ - Updated dependencies [e686f4d]
1896
+ - Updated dependencies [212c451]
1897
+ - Updated dependencies [a04b06d]
1898
+ - Updated dependencies [4ab4f1b]
1899
+ - Updated dependencies [fa5fbd9]
1900
+ - Updated dependencies [5f44cc6]
1901
+ - Updated dependencies [b57107d]
1902
+ - Updated dependencies [e3ea4f9]
1903
+ - Updated dependencies [65f1e8d]
1904
+ - Updated dependencies [fd6f5da]
1905
+ - Updated dependencies [1f8ef0a]
1906
+ - Updated dependencies [bb5d4ee]
1907
+ - Updated dependencies [dc666f7]
1908
+ - Updated dependencies [3335767]
1909
+ - Updated dependencies [8b1f066]
1910
+ - Updated dependencies [af243c1]
1911
+ - Updated dependencies [cff4b77]
1912
+ - Updated dependencies [31938f0]
1913
+ - Updated dependencies [961ceaa]
1914
+ - Updated dependencies [f3f4e4c]
1915
+ - Updated dependencies [a05c350]
1916
+ - Updated dependencies [1dbb993]
1917
+ - Updated dependencies [2b5f509]
1918
+ - Updated dependencies [808f339]
1919
+ - Updated dependencies [6cf5999]
1920
+ - Updated dependencies [274e14a]
1921
+ - Updated dependencies [8c10f4f]
1922
+ - Updated dependencies [90dac98]
1923
+ - Updated dependencies [6096f20]
1924
+ - Updated dependencies [544aca2]
1925
+ - Updated dependencies [ea02938]
1926
+ - Updated dependencies [a14fb23]
1927
+ - Updated dependencies [ae98f1d]
1928
+ - Updated dependencies [f98eddf]
1929
+ - Updated dependencies [ce6bd99]
1930
+ - Updated dependencies [a5b08c9]
1931
+ - Updated dependencies [86982ac]
1932
+ - Updated dependencies [8c929e6]
1933
+ - Updated dependencies [cdefa2a]
1934
+ - Updated dependencies [2fc2a24]
1935
+ - Updated dependencies [cc4366d]
1936
+ - Updated dependencies [0961d5e]
1937
+ - Updated dependencies [9d25b9b]
1938
+ - Updated dependencies [6276478]
1939
+ - Updated dependencies [5e67837]
1940
+ - Updated dependencies [ff14e29]
1941
+ - Updated dependencies [9b28151]
1942
+ - Updated dependencies [64563a9]
1943
+ - Updated dependencies [1a5003f]
1944
+ - Updated dependencies [09ab32b]
1945
+ - Updated dependencies [8acc51b]
1946
+ - Updated dependencies [ea9d17f]
1947
+ - Updated dependencies [45362a3]
1948
+ - Updated dependencies [2a943bf]
1949
+ - Updated dependencies [111fa4c]
1950
+ - Updated dependencies [d999617]
1951
+ - Updated dependencies [93a689d]
1952
+ - Updated dependencies [4357a27]
1953
+ - Updated dependencies [e5f4343]
1954
+ - Updated dependencies [3261e64]
1955
+ - Updated dependencies [f5178a2]
1956
+ - Updated dependencies [2ad3671]
1957
+ - Updated dependencies [39bf246]
1958
+ - Updated dependencies [8740e86]
1959
+ - Updated dependencies [d22b37b]
1960
+ - Updated dependencies [9cbe4db]
1961
+ - Updated dependencies [8c0e550]
1962
+ - Updated dependencies [fde4caf]
1963
+ - Updated dependencies [caf0ed0]
1964
+ - Updated dependencies [1daf477]
1965
+ - Updated dependencies [3d614ea]
1966
+ - Updated dependencies [a7df45f]
1967
+ - Updated dependencies [6c2f3c5]
1968
+ - Updated dependencies [fb13e85]
1969
+ - Updated dependencies [c2d8659]
1970
+ - Updated dependencies [6516320]
1971
+ - Updated dependencies [98b1a7c]
1972
+ - Updated dependencies [e0f8202]
1973
+ - Updated dependencies [ac2d6f1]
1974
+ - Updated dependencies [9fbbb17]
1975
+ - Updated dependencies [c3a26cc]
1976
+ - Updated dependencies [a66e58e]
1977
+ - Updated dependencies [d89492c]
1978
+ - Updated dependencies [9a5f998]
1979
+ - Updated dependencies [1c5ee33]
1980
+ - Updated dependencies [9327397]
1981
+ - Updated dependencies [17cc3a3]
1982
+ - Updated dependencies [a9c5ea0]
1983
+ - Updated dependencies [02e6d36]
1984
+ - Updated dependencies [4758b33]
1985
+ - Updated dependencies [4758b33]
1986
+ - Updated dependencies [4758b33]
1987
+ - Updated dependencies [8848ce4]
1988
+ - Updated dependencies [f905090]
1989
+ - Updated dependencies [3cd6c5e]
1990
+ - Updated dependencies [5bb855d]
1991
+ - Updated dependencies [9c78ebe]
1992
+ - Updated dependencies [12809a5]
1993
+ - Updated dependencies [9c78ebe]
1994
+ - Updated dependencies [12809a5]
1995
+ - Updated dependencies [9c78ebe]
1996
+ - Updated dependencies [12809a5]
1997
+ - Updated dependencies [7afc81d]
1998
+ - Updated dependencies [f9c06ef]
1999
+ - Updated dependencies [93a5585]
2000
+ - Updated dependencies [5ad3b88]
2001
+ - Updated dependencies [21eb61a]
2002
+ - Updated dependencies [f9d772b]
2003
+ - Updated dependencies [bf14b64]
2004
+ - Updated dependencies [4345558]
2005
+ - Updated dependencies [97b6c21]
2006
+ - Updated dependencies [26ca2ad]
2007
+ - Updated dependencies [41ae65b]
2008
+ - Updated dependencies [184cfe1]
2009
+ - Updated dependencies [baac95a]
2010
+ - Updated dependencies [13220af]
2011
+ - Updated dependencies [29b45f6]
2012
+ - Updated dependencies [39b8d51]
2013
+ - Updated dependencies [17b323e]
2014
+ - Updated dependencies [b956e69]
2015
+ - Updated dependencies [b32e7de]
2016
+ - Updated dependencies [ff94a12]
2017
+ - Updated dependencies [33e58d8]
2018
+ - Updated dependencies [256b4c9]
2019
+ - Updated dependencies [97672ba]
2020
+ - Updated dependencies [c5ec15c]
2021
+ - Updated dependencies [fec3b1a]
2022
+ - Updated dependencies [b8e0941]
2023
+ - Updated dependencies [0c50f18]
2024
+ - Updated dependencies [285e36b]
2025
+ - Updated dependencies [1dae95a]
2026
+ - Updated dependencies [e32dae1]
2027
+ - Updated dependencies [d0c0c7f]
2028
+ - Updated dependencies [30b11ad]
2029
+ - Updated dependencies [4aebea0]
2030
+ - Updated dependencies [f976774]
2031
+ - Updated dependencies [3d6badf]
2032
+ - Updated dependencies [25cb364]
2033
+ - Updated dependencies [a60539b]
2034
+ - Updated dependencies [de1b879]
2035
+ - Updated dependencies [c6678b1]
2036
+ - Updated dependencies [0638322]
2037
+ - Updated dependencies [e3782d2]
2038
+ - Updated dependencies [db0beb2]
2039
+ - Updated dependencies [997ce38]
2040
+ - Updated dependencies [ae0b9d3]
2041
+ - Updated dependencies [ad1785c]
2042
+ - Updated dependencies [3b469c8]
2043
+ - Updated dependencies [990a2d6]
2044
+ - Updated dependencies [990a2d6]
2045
+ - Updated dependencies [37140f4]
2046
+ - Updated dependencies [1c84036]
2047
+ - Updated dependencies [1c84036]
2048
+ - Updated dependencies [6650259]
2049
+ - Updated dependencies [4f8b7f8]
2050
+ - Updated dependencies [9e6619f]
2051
+ - Updated dependencies [f6ae5e2]
2052
+ - Updated dependencies [eb97ce6]
2053
+ - Updated dependencies [7343376]
2054
+ - Updated dependencies [b2683a2]
2055
+ - Updated dependencies [dded788]
2056
+ - Updated dependencies [b45d463]
2057
+ - Updated dependencies [54a7830]
2058
+ - Updated dependencies [f3135a4]
2059
+ - Updated dependencies [b5696d3]
2060
+ - Updated dependencies [3f9d926]
2061
+ - Updated dependencies [e978ed5]
2062
+ - Updated dependencies [6a7f24e]
2063
+ - Updated dependencies [b3c96d6]
2064
+ - Updated dependencies [8d0ca91]
2065
+ - Updated dependencies [c30c8dd]
2066
+ - Updated dependencies [244d516]
2067
+ - Updated dependencies [deca847]
2068
+ - Updated dependencies [ac15833]
2069
+ - Updated dependencies [ac15833]
2070
+ - Updated dependencies [e2dffc9]
2071
+ - Updated dependencies [328abeb]
2072
+ - Updated dependencies [dd0d78f]
2073
+ - Updated dependencies [24d3e65]
2074
+ - Updated dependencies [95a7c8d]
2075
+ - Updated dependencies [e227156]
2076
+ - Updated dependencies [cc4e476]
2077
+ - Updated dependencies [92970c4]
2078
+ - Updated dependencies [d570eaa]
2079
+ - Updated dependencies [4b742f4]
2080
+ - Updated dependencies [42687ba]
2081
+ - Updated dependencies [6cd8f66]
2082
+ - Updated dependencies [24a0f14]
2083
+ - Updated dependencies [797a30f]
2084
+ - Updated dependencies [27ae632]
2085
+ - Updated dependencies [b4075c0]
2086
+ - Updated dependencies [9b85600]
2087
+ - Updated dependencies [e327c89]
2088
+ - Updated dependencies [2eaf5be]
2089
+ - Updated dependencies [bf7ab35]
2090
+ - Updated dependencies [99878d8]
2091
+ - Updated dependencies [3c13675]
2092
+ - Updated dependencies [63ab761]
2093
+ - Updated dependencies [0eb9f36]
2094
+ - Updated dependencies [ae582b7]
2095
+ - Updated dependencies [62d6f56]
2096
+ - Updated dependencies [51c2949]
2097
+ - Updated dependencies [a4b017e]
2098
+ - Updated dependencies [8732846]
2099
+ - Updated dependencies [559a2e2]
2100
+ - Updated dependencies [db11afd]
2101
+ - Updated dependencies [154075a]
2102
+ - Updated dependencies [582edef]
2103
+ - Updated dependencies [19f484f]
2104
+ - Updated dependencies [0a78a20]
2105
+ - Updated dependencies [615346d]
2106
+ - Updated dependencies [75dcc81]
2107
+ - Updated dependencies [55a12a8]
2108
+ - Updated dependencies [edfcf5a]
2109
+ - Updated dependencies [0a3e540]
2110
+ - Updated dependencies [c021b35]
2111
+ - Updated dependencies [f61dab1]
2112
+ - Updated dependencies [b0a05dd]
2113
+ - Updated dependencies [dd5ff19]
2114
+ - Updated dependencies [54997ff]
2115
+ - Updated dependencies [81f8498]
2116
+ - Updated dependencies [a782fa7]
2117
+ - Updated dependencies [1d6a23d]
2118
+ - Updated dependencies [0645133]
2119
+ - Updated dependencies [76e9df0]
2120
+ - Updated dependencies [0ecaa7d]
2121
+ - Updated dependencies [b24f93a]
2122
+ - Updated dependencies [6158e4c]
2123
+ - Updated dependencies [cff8641]
2124
+ - Updated dependencies [3f61eef]
2125
+ - Updated dependencies [c27b575]
2126
+ - Updated dependencies [84b275c]
2127
+ - Updated dependencies [0e6e76b]
2128
+ - Updated dependencies [bf43afa]
2129
+ - Updated dependencies [385ebc5]
2130
+ - Updated dependencies [3a0e7ab]
2131
+ - Updated dependencies [858eafb]
2132
+ - Updated dependencies [a8c5509]
2133
+ - Updated dependencies [c2a8d23]
2134
+ - Updated dependencies [f4ed238]
2135
+ - Updated dependencies [0ffc423]
2136
+ - Updated dependencies [3cc4fe5]
2137
+ - Updated dependencies [cd5b19a]
2138
+ - Updated dependencies [cd5b19a]
2139
+ - Updated dependencies [17dc167]
2140
+ - Updated dependencies [20d23be]
2141
+ - Updated dependencies [20d23be]
2142
+ - Updated dependencies [2e3da72]
2143
+ - Updated dependencies [1263e40]
2144
+ - Updated dependencies [e6bc087]
2145
+ - Updated dependencies [9419df1]
2146
+ - Updated dependencies [8bab157]
2147
+ - Updated dependencies [a7557a7]
2148
+ - Updated dependencies [7d074ba]
2149
+ - Updated dependencies [6158e4c]
2150
+ - Updated dependencies [6158e4c]
2151
+ - Updated dependencies [52aad5c]
2152
+ - Updated dependencies [18d1a0a]
2153
+ - Updated dependencies [e420df3]
2154
+ - Updated dependencies [7fed09d]
2155
+ - Updated dependencies [c1763e5]
2156
+ - Updated dependencies [58da8ae]
2157
+ - Updated dependencies [a8b9889]
2158
+ - Updated dependencies [138ad45]
2159
+ - Updated dependencies [138ad45]
2160
+ - Updated dependencies [5262f7d]
2161
+ - Updated dependencies [6aa029b]
2162
+ - Updated dependencies [2124d04]
2163
+ - Updated dependencies [be52115]
2164
+ - Updated dependencies [770cc5b]
2165
+ - Updated dependencies [1a88ce2]
2166
+ - Updated dependencies [a1a44d6]
2167
+ - Updated dependencies [e0a9c67]
2168
+ - Updated dependencies [5638529]
2169
+ - Updated dependencies [5638529]
2170
+ - Updated dependencies [d0fba91]
2171
+ - Updated dependencies [c476be0]
2172
+ - Updated dependencies [c82ff39]
2173
+ - Updated dependencies [6c3da53]
2174
+ - Updated dependencies [31987bd]
2175
+ - Updated dependencies [3c3ce15]
2176
+ - Updated dependencies [063119f]
2177
+ - Updated dependencies [e100589]
2178
+ - Updated dependencies [304f611]
2179
+ - Updated dependencies [e46ee77]
2180
+ - Updated dependencies [f9c8c4e]
2181
+ - Updated dependencies [6e9c8d2]
2182
+ - Updated dependencies [9547063]
2183
+ - Updated dependencies [3f6efd6]
2184
+ - Updated dependencies [52c95a1]
2185
+ - Updated dependencies [55d18c6]
2186
+ - Updated dependencies [c4ab6d0]
2187
+ - Updated dependencies [0e9058b]
2188
+ - Updated dependencies [c4ab6d0]
2189
+ - Updated dependencies [5988b6b]
2190
+ - Updated dependencies [6158e4c]
2191
+ - Updated dependencies [00ccdf7]
2192
+ - Updated dependencies [9d9ed54]
2193
+ - Updated dependencies [6007dd4]
2194
+ - Updated dependencies [4a1adb7]
2195
+ - Updated dependencies [4a1adb7]
2196
+ - Updated dependencies [4a1adb7]
2197
+ - Updated dependencies [4a1adb7]
2198
+ - Updated dependencies [185b7a0]
2199
+ - Updated dependencies [50c73fe]
2200
+ - Updated dependencies [ca3de72]
2201
+ - Updated dependencies [83e3f83]
2202
+ - Updated dependencies [401611b]
2203
+ - Updated dependencies [2c0ddf2]
2204
+ - Updated dependencies [4abc0aa]
2205
+ - Updated dependencies [f560ded]
2206
+ - Updated dependencies [f560ded]
2207
+ - Updated dependencies [2b188fa]
2208
+ - Updated dependencies [b654d4e]
2209
+ - Updated dependencies [f68e0a0]
2210
+ - Updated dependencies [aea682a]
2211
+ - Updated dependencies [fcdc8ec]
2212
+ - Updated dependencies [2d576e4]
2213
+ - Updated dependencies [8366acc]
2214
+ - Updated dependencies [95e58a3]
2215
+ - Updated dependencies [9d7419b]
2216
+ - Updated dependencies [fc7db05]
2217
+ - Updated dependencies [fc7db05]
2218
+ - Updated dependencies [9ed8d0f]
2219
+ - Updated dependencies [c73cdb5]
2220
+ - Updated dependencies [6f5719e]
2221
+ - Updated dependencies [b34cc14]
2222
+ - Updated dependencies [ab18797]
2223
+ - Updated dependencies [d0097af]
2224
+ - Updated dependencies [432882b]
2225
+ - Updated dependencies [64dae8e]
2226
+ - Updated dependencies [b06e374]
2227
+ - Updated dependencies [06a8af5]
2228
+ - Updated dependencies [6a91586]
2229
+ - Updated dependencies [a04d7c6]
2230
+ - Updated dependencies [5ccc500]
2231
+ - Updated dependencies [f3c2bb0]
2232
+ - Updated dependencies [978507b]
2233
+ - Updated dependencies [778138e]
2234
+ - Updated dependencies [9801765]
2235
+ - Updated dependencies [9cebfca]
2236
+ - Updated dependencies [460575f]
2237
+ - Updated dependencies [d796c8d]
2238
+ - Updated dependencies [594704f]
2239
+ - Updated dependencies [d3995fe]
2240
+ - Updated dependencies [1b1d772]
2241
+ - Updated dependencies [d88e20f]
2242
+ - Updated dependencies [f66072d]
2243
+ - Updated dependencies [2d7304d]
2244
+ - Updated dependencies [636b236]
2245
+ - Updated dependencies [4172589]
2246
+ - Updated dependencies [d6d8fb9]
2247
+ - Updated dependencies [64d624d]
2248
+ - Updated dependencies [053fdc8]
2249
+ - Updated dependencies [41b7ce3]
2250
+ - Updated dependencies [ae476b8]
2251
+ - Updated dependencies [39f4309]
2252
+ - Updated dependencies [95bad12]
2253
+ - Updated dependencies [d2fb6ef]
2254
+ - Updated dependencies [7cd3987]
2255
+ - Updated dependencies [ee3b878]
2256
+ - Updated dependencies [e304a4e]
2257
+ - Updated dependencies [fda49e5]
2258
+ - Updated dependencies [490d9a9]
2259
+ - Updated dependencies [1117414]
2260
+ - Updated dependencies [6d63cd0]
2261
+ - Updated dependencies [fc62bb4]
2262
+ - Updated dependencies [41df893]
2263
+ - Updated dependencies [0cba1b7]
2264
+ - Updated dependencies [7c96c94]
2265
+ - Updated dependencies [4da5109]
2266
+ - Updated dependencies [00f3eb5]
2267
+ - Updated dependencies [1ec291c]
2268
+ - Updated dependencies [453dbaa]
2269
+ - Updated dependencies [95f8704]
2270
+ - Updated dependencies [f8cdbf2]
2271
+ - Updated dependencies [69a2163]
2272
+ - Updated dependencies [24e027e]
2273
+ - Updated dependencies [2c3cd1b]
2274
+ - Updated dependencies [e176053]
2275
+ - Updated dependencies [e30ed15]
2276
+ - Updated dependencies [90665e0]
2277
+ - Updated dependencies [8d3a529]
2278
+ - Updated dependencies [5ac2e2c]
2279
+ - Updated dependencies [194fae1]
2280
+ - Updated dependencies [63d54dd]
2281
+ - Updated dependencies [7e19d03]
2282
+ - Updated dependencies [b08b7eb]
2283
+ - Updated dependencies [1e946c9]
2284
+ - Updated dependencies [546ddf7]
2285
+ - Updated dependencies [864154e]
2286
+ - Updated dependencies [b023625]
2287
+ - Updated dependencies [75bd83d]
2288
+ - Updated dependencies [44d075b]
2289
+ - Updated dependencies [40c479a]
2290
+ - Updated dependencies [b4393e5]
2291
+ - Updated dependencies [971d387]
2292
+ - Updated dependencies [ee851c3]
2293
+ - Updated dependencies [6414dfd]
2294
+ - Updated dependencies [a8d5c71]
2295
+ - Updated dependencies [905b21f]
2296
+ - Updated dependencies [88e9109]
2297
+ - Updated dependencies [2c45966]
2298
+ - Updated dependencies [db3a600]
2299
+ - Updated dependencies [3a3db76]
2300
+ - Updated dependencies [0d723a3]
2301
+ - Updated dependencies [0c95d3d]
2302
+ - Updated dependencies [3e4fa2c]
2303
+ - Updated dependencies [b5b928a]
2304
+ - Updated dependencies [6fd2cf7]
2305
+ - Updated dependencies [5fa06c4]
2306
+ - Updated dependencies [52a43de]
2307
+ - Updated dependencies [195052f]
2308
+ - Updated dependencies [e4559d1]
2309
+ - Updated dependencies [2c71482]
2310
+ - Updated dependencies [129bcc5]
2311
+ - Updated dependencies [d3005f7]
2312
+ - Updated dependencies [1e7fe0a]
2313
+ - Updated dependencies [a26b9e4]
2314
+ - Updated dependencies [5ef9c4f]
2315
+ - Updated dependencies [46f0bb4]
2316
+ - Updated dependencies [06b82b8]
2317
+ - Updated dependencies [8ec11e1]
2318
+ - Updated dependencies [6f81384]
2319
+ - Updated dependencies [22ba927]
2320
+ - Updated dependencies [8631c32]
2321
+ - Updated dependencies [f8c70f4]
2322
+ - Updated dependencies [5d3a2d1]
2323
+ - Updated dependencies [8f1d995]
2324
+ - Updated dependencies [b362c1b]
2325
+ - Updated dependencies [f9c34df]
2326
+ - Updated dependencies [dddb942]
2327
+ - Updated dependencies [00c665e]
2328
+ - Updated dependencies [29754cf]
2329
+ - Updated dependencies [d7de534]
2330
+ - Updated dependencies [3c2b6f7]
2331
+ - Updated dependencies [6e88630]
2332
+ - Updated dependencies [b84dc18]
2333
+ - Updated dependencies [ac8abb0]
2334
+ - Updated dependencies [9d86e1d]
2335
+ - Updated dependencies [3a5817f]
2336
+ - Updated dependencies [99a3c2d]
2337
+ - Updated dependencies [5961030]
2338
+ - Updated dependencies [f24de8b]
2339
+ - Updated dependencies [c8ea8af]
2340
+ - Updated dependencies [9602dc8]
2341
+ - Updated dependencies [3777538]
2342
+ - Updated dependencies [3190414]
2343
+ - Updated dependencies [4e480f5]
2344
+ - Updated dependencies [38a123c]
2345
+ - Updated dependencies [299102e]
2346
+ - Updated dependencies [30c73cd]
2347
+ - Updated dependencies [830ed58]
2348
+ - Updated dependencies [d7acad6]
2349
+ - Updated dependencies [45a9aeb]
2350
+ - Updated dependencies [713db46]
2351
+ - Updated dependencies [c71e14d]
2352
+ - Updated dependencies [bf3a03c]
2353
+ - Updated dependencies [cb55718]
2354
+ - Updated dependencies [748494b]
2355
+ - Updated dependencies [5967be0]
2356
+ - Updated dependencies [831be72]
2357
+ - Updated dependencies [29cb85b]
2358
+ - Updated dependencies [3e028c8]
2359
+ - Updated dependencies [d0889e2]
2360
+ - Updated dependencies [ce503e5]
2361
+ - Updated dependencies [f20dcf0]
2362
+ - Updated dependencies [12402a9]
2363
+ - Updated dependencies [aff3d7a]
2364
+ - Updated dependencies [4ca30d0]
2365
+ - Updated dependencies [7a5da14]
2366
+ - Updated dependencies [fff9645]
2367
+ - Updated dependencies [9c3b7ce]
2368
+ - Updated dependencies [2c1c967]
2369
+ - Updated dependencies [9486ac6]
2370
+ - Updated dependencies [9486ac6]
2371
+ - Updated dependencies [4d5f9b4]
2372
+ - Updated dependencies [d6ceb8d]
2373
+ - Updated dependencies [dc4365c]
2374
+ - Updated dependencies [e321d52]
2375
+ - Updated dependencies [969ba84]
2376
+ - Updated dependencies [98188c2]
2377
+ - Updated dependencies [4c68077]
2378
+ - Updated dependencies [7977ff9]
2379
+ - Updated dependencies [3beef6d]
2380
+ - Updated dependencies [06b8c42]
2381
+ - Updated dependencies [46b9bc9]
2382
+ - Updated dependencies [f46bd39]
2383
+ - Updated dependencies [b98352a]
2384
+ - Updated dependencies [b76ca67]
2385
+ - Updated dependencies [45ac2cb]
2386
+ - Updated dependencies [b97790a]
2387
+ - Updated dependencies [dbd5194]
2388
+ - Updated dependencies [7c9b044]
2389
+ - Updated dependencies [e552c31]
2390
+ - Updated dependencies [d47de51]
2391
+ - Updated dependencies [3fe6463]
2392
+ - Updated dependencies [b392674]
2393
+ - Updated dependencies [4f3a1e2]
2394
+ - Updated dependencies [31ab372]
2395
+ - Updated dependencies [846889b]
2396
+ - Updated dependencies [2acd8e1]
2397
+ - Updated dependencies [7b90231]
2398
+ - Updated dependencies [26896c6]
2399
+ - Updated dependencies [a439e16]
2400
+ - Updated dependencies [67fc3b0]
2401
+ - Updated dependencies [8579e34]
2402
+ - Updated dependencies [d57db5d]
2403
+ - Updated dependencies [33a3b3c]
2404
+ - Updated dependencies [b87f15b]
2405
+ - Updated dependencies [9409eb9]
2406
+ - Updated dependencies [045d20b]
2407
+ - Updated dependencies [a2d2515]
2408
+ - Updated dependencies [c18d099]
2409
+ - Updated dependencies [0caacca]
2410
+ - Updated dependencies [adb2a86]
2411
+ - Updated dependencies [03380aa]
2412
+ - Updated dependencies [4562ea5]
2413
+ - Updated dependencies [3619792]
2414
+ - Updated dependencies [3561bd2]
2415
+ - Updated dependencies [bf97b98]
2416
+ - Updated dependencies [320374d]
2417
+ - Updated dependencies [b0d308d]
2418
+ - Updated dependencies [b458300]
2419
+ - Updated dependencies [40f34b4]
2420
+ - Updated dependencies [bd0376d]
2421
+ - Updated dependencies [8063bcb]
2422
+ - Updated dependencies [b74a859]
2423
+ - Updated dependencies [d4493fd]
2424
+ - Updated dependencies [240b80f]
2425
+ - Updated dependencies [77cb489]
2426
+ - Updated dependencies [bfaa158]
2427
+ - Updated dependencies [777e5c6]
2428
+ - Updated dependencies [0c386dd]
2429
+ - Updated dependencies [39d69ad]
2430
+ - Updated dependencies [9e37d9b]
2431
+ - Updated dependencies [5ad86dd]
2432
+ - Updated dependencies [16a725f]
2433
+ - Updated dependencies [c4326fe]
2434
+ - Updated dependencies [4dfdcc3]
2435
+ - Updated dependencies [6a449fc]
2436
+ - Updated dependencies [446d93d]
2437
+ - Updated dependencies [ecd9cb2]
2438
+ - Updated dependencies [f08bcd9]
2439
+ - Updated dependencies [98d4108]
2440
+ - Updated dependencies [0e3b3be]
2441
+ - Updated dependencies [a29ae2d]
2442
+ - Updated dependencies [220c18d]
2443
+ - Updated dependencies [eeb6c2f]
2444
+ - Updated dependencies [00d3f09]
2445
+ - Updated dependencies [4388f71]
2446
+ - Updated dependencies [0b1ac58]
2447
+ - Updated dependencies [c93b4d5]
2448
+ - Updated dependencies [c1fe272]
2449
+ - Updated dependencies [3cab570]
2450
+ - Updated dependencies [8ad218d]
2451
+ - Updated dependencies [3e41187]
2452
+ - Updated dependencies [5f78953]
2453
+ - Updated dependencies [639114c]
2454
+ - Updated dependencies [639114c]
2455
+ - Updated dependencies [1490691]
2456
+ - Updated dependencies [e8e4c4d]
2457
+ - Updated dependencies [1f31d3a]
2458
+ - Updated dependencies [d1842ab]
2459
+ - Updated dependencies [854cba3]
2460
+ - Updated dependencies [78ca238]
2461
+ - Updated dependencies [d8ec8d6]
2462
+ - Updated dependencies [351eb31]
2463
+ - Updated dependencies [866cd1d]
2464
+ - Updated dependencies [20c04b2]
2465
+ - Updated dependencies [01c9023]
2466
+ - Updated dependencies [48c19bd]
2467
+ - Updated dependencies [a6d8b8d]
2468
+ - Updated dependencies [4b5bb95]
2469
+ - Updated dependencies [b652514]
2470
+ - Updated dependencies [adbda1b]
2471
+ - Updated dependencies [adbda1b]
2472
+ - Updated dependencies [8952395]
2473
+ - Updated dependencies [e2b3826]
2474
+ - Updated dependencies [a338037]
2475
+ - Updated dependencies [0348bc9]
2476
+ - Updated dependencies [e8c553b]
2477
+ - Updated dependencies [2e32ed4]
2478
+ - Updated dependencies [554e647]
2479
+ - Updated dependencies [3ed3eec]
2480
+ - Updated dependencies [7c3df8f]
2481
+ - Updated dependencies [a4514e8]
2482
+ - Updated dependencies [6411def]
2483
+ - Updated dependencies [db3896c]
2484
+ - Updated dependencies [b9f5ff1]
2485
+ - Updated dependencies [e75f4c9]
2486
+ - Updated dependencies [19f1639]
2487
+ - Updated dependencies [4704aa4]
2488
+ - Updated dependencies [47547d0]
2489
+ - Updated dependencies [1bee5d0]
2490
+ - Updated dependencies [63a8828]
2491
+ - Updated dependencies [b61d7d8]
2492
+ - Updated dependencies [858cd72]
2493
+ - Updated dependencies [cfc9b6d]
2494
+ - Updated dependencies [dc0a60b]
2495
+ - Updated dependencies [554f2b6]
2496
+ - Updated dependencies [72f55c9]
2497
+ - Updated dependencies [26e06d7]
2498
+ - Updated dependencies [669d71b]
2499
+ - Updated dependencies [ed27d7c]
2500
+ - Updated dependencies [52c8cf7]
2501
+ - Updated dependencies [2ceb43a]
2502
+ - Updated dependencies [7cdd2b9]
2503
+ - Updated dependencies [52c8cf7]
2504
+ - Updated dependencies [3399704]
2505
+ - Updated dependencies [02fe257]
2506
+ - Updated dependencies [71a4a53]
2507
+ - Updated dependencies [7bf244b]
2508
+ - Updated dependencies [f0bb9fa]
2509
+ - Updated dependencies [81a2eb1]
2510
+ - Updated dependencies [caa0cd3]
2511
+ - Updated dependencies [caa0cd3]
2512
+ - Updated dependencies [20cb8db]
2513
+ - Updated dependencies [25c7d58]
2514
+ - Updated dependencies [00d2fa6]
2515
+ - Updated dependencies [77b2a18]
2516
+ - Updated dependencies [c6198c2]
2517
+ - Updated dependencies [721d1e0]
2518
+ - Updated dependencies [c2f0f48]
2519
+ - Updated dependencies [1237ae4]
2520
+ - Updated dependencies [2f61238]
2521
+ - Updated dependencies [51eb515]
2522
+ - Updated dependencies [c354ce5]
2523
+ - Updated dependencies [8fe8e5c]
2524
+ - Updated dependencies [feac439]
2525
+ - Updated dependencies [9ae871d]
2526
+ - Updated dependencies [efbd566]
2527
+ - Updated dependencies [2a5bf45]
2528
+ - Updated dependencies [9587fc9]
2529
+ - Updated dependencies [e62c44e]
2530
+ - Updated dependencies [daf9d57]
2531
+ - Updated dependencies [fe8f451]
2532
+ - Updated dependencies [23b9958]
2533
+ - Updated dependencies [c15d7ec]
2534
+ - Updated dependencies [5d0876c]
2535
+ - Updated dependencies [f7ace0a]
2536
+ - Updated dependencies [b041b9c]
2537
+ - Updated dependencies [ce2aaef]
2538
+ - Updated dependencies [544ecba]
2539
+ - Updated dependencies [2ce2612]
2540
+ - Updated dependencies [bc640ec]
2541
+ - Updated dependencies [1e215c4]
2542
+ - Updated dependencies [da6e191]
2543
+ - Updated dependencies [3e377c9]
2544
+ - Updated dependencies [a3eb5d0]
2545
+ - Updated dependencies [4ce14f1]
2546
+ - Updated dependencies [aef97e5]
2547
+ - Updated dependencies [2af1fa7]
2548
+ - Updated dependencies [c14d3a0]
2549
+ - Updated dependencies [a137d0c]
2550
+ - Updated dependencies [caf477f]
2551
+ - Updated dependencies [f6375da]
2552
+ - Updated dependencies [967e5d8]
2553
+ - Updated dependencies [c907a9c]
2554
+ - Updated dependencies [a4611b3]
2555
+ - Updated dependencies [20316ba]
2556
+ - Updated dependencies [d3499b3]
2557
+ - Updated dependencies [91f9276]
2558
+ - Updated dependencies [309c75e]
2559
+ - Updated dependencies [c9f9bae]
2560
+ - Updated dependencies [18897a4]
2561
+ - Updated dependencies [8b7ea39]
2562
+ - Updated dependencies [a915064]
2563
+ - Updated dependencies [dcbf0b2]
2564
+ - Updated dependencies [52cac38]
2565
+ - Updated dependencies [93fea2e]
2566
+ - Updated dependencies [1422a92]
2567
+ - Updated dependencies [d05fe17]
2568
+ - Updated dependencies [a480f79]
2569
+ - Updated dependencies [f08d1a8]
2570
+ - Updated dependencies [64a252d]
2571
+ - Updated dependencies [786bc91]
2572
+ - Updated dependencies [75fca96]
2573
+ - Updated dependencies [7ca6ddd]
2574
+ - Updated dependencies [f1cd290]
2575
+ - Updated dependencies [5a41ce7]
2576
+ - Updated dependencies [8d50bc2]
2577
+ - Updated dependencies [604476d]
2578
+ - Updated dependencies [d1bebb0]
2579
+ - Updated dependencies [95bf128]
2580
+ - Updated dependencies [335abea]
2581
+ - Updated dependencies [edea22a]
2582
+ - Updated dependencies [0f5cadf]
2583
+ - Updated dependencies [4f9f1ee]
2584
+ - Updated dependencies [66e8b2a]
2585
+ - Updated dependencies [aa083cd]
2586
+ - Updated dependencies [12b5992]
2587
+ - Updated dependencies [b93e245]
2588
+ - Updated dependencies [c842594]
2589
+ - Updated dependencies [290de37]
2590
+ - Updated dependencies [e1c27e4]
2591
+ - Updated dependencies [8c8da45]
2592
+ - Updated dependencies [8cd8eb5]
2593
+ - Updated dependencies [f52a9d7]
2594
+ - Updated dependencies [cf1d29e]
2595
+ - Updated dependencies [1bd79c8]
2596
+ - Updated dependencies [af9e957]
2597
+ - Updated dependencies [b1030c7]
2598
+ - Updated dependencies [c974edf]
2599
+ - Updated dependencies [592402e]
2600
+ - Updated dependencies [ad852b6]
2601
+ - Updated dependencies [6778809]
2602
+ - Updated dependencies [3a3dd28]
2603
+ - Updated dependencies [7fb22a1]
2604
+ - Updated dependencies [ad66d79]
2605
+ - Updated dependencies [0758bd8]
2606
+ - Updated dependencies [ee4d19f]
2607
+ - Updated dependencies [37149ec]
2608
+ - Updated dependencies [496d31d]
2609
+ - Updated dependencies [7ed9808]
2610
+ - Updated dependencies [0ea7054]
2611
+ - Updated dependencies [ac0e39a]
2612
+ - Updated dependencies [9a853f2]
2613
+ - Updated dependencies [cb847fd]
2614
+ - Updated dependencies [ee70287]
2615
+ - Updated dependencies [3e98e13]
2616
+ - Updated dependencies [a695f50]
2617
+ - Updated dependencies [fc32921]
2618
+ - Updated dependencies [4eaa835]
2619
+ - Updated dependencies [8f9d87a]
2620
+ - Updated dependencies [b1777ae]
2621
+ - Updated dependencies [24845c4]
2622
+ - Updated dependencies [6f864cf]
2623
+ - Updated dependencies [24d1edd]
2624
+ - Updated dependencies [645087c]
2625
+ - Updated dependencies [33f4a19]
2626
+ - Updated dependencies [6e9a3d4]
2627
+ - Updated dependencies [4a292d2]
2628
+ - Updated dependencies [5323168]
2629
+ - Updated dependencies [841dd2b]
2630
+ - Updated dependencies [3014fc0]
2631
+ - Updated dependencies [dacb402]
2632
+ - Updated dependencies [846cec0]
2633
+ - Updated dependencies [91facae]
2634
+ - Updated dependencies [b38014e]
2635
+ - Updated dependencies [e2feb13]
2636
+ - Updated dependencies [474797d]
2637
+ - Updated dependencies [704e695]
2638
+ - Updated dependencies [9dcc545]
2639
+ - Updated dependencies [d7fecfb]
2640
+ - Updated dependencies [c13d39e]
2641
+ - Updated dependencies [a407bd6]
2642
+ - Updated dependencies [317dbce]
2643
+ - Updated dependencies [309728c]
2644
+ - Updated dependencies [c03d03b]
2645
+ - Updated dependencies [e6ec217]
2646
+ - Updated dependencies [aa08d7e]
2647
+ - Updated dependencies [3a43a15]
2648
+ - Updated dependencies [868e825]
2649
+ - Updated dependencies [f76f436]
2650
+ - Updated dependencies [ce45a03]
2651
+ - Updated dependencies [7cf6f38]
2652
+ - Updated dependencies [fd9c50a]
2653
+ - Updated dependencies [421544b]
2654
+ - Updated dependencies [5cc8c28]
2655
+ - Updated dependencies [fb01022]
2656
+ - Updated dependencies [e9d9212]
2657
+ - Updated dependencies [ecfb693]
2658
+ - Updated dependencies [639ca9d]
2659
+ - Updated dependencies [2152962]
2660
+ - Updated dependencies [40a7c53]
2661
+ - Updated dependencies [abc1b18]
2662
+ - Updated dependencies [81a51db]
2663
+ - Updated dependencies [67749c7]
2664
+ - Updated dependencies [507b61b]
2665
+ - Updated dependencies [512c84b]
2666
+ - Updated dependencies [c300267]
2667
+ - Updated dependencies [fb3a101]
2668
+ - Updated dependencies [d4733f2]
2669
+ - Updated dependencies [7c9145f]
2670
+ - Updated dependencies [1570eac]
2671
+ - Updated dependencies [f391ede]
2672
+ - Updated dependencies [f5cfbbd]
2673
+ - Updated dependencies [f5cfbbd]
2674
+ - Updated dependencies [8b532cb]
2675
+ - Updated dependencies [64c3cdd]
2676
+ - Updated dependencies [4d65991]
2677
+ - Updated dependencies [c42554e]
2678
+ - Updated dependencies [3e71b26]
2679
+ - Updated dependencies [b89583b]
2680
+ - Updated dependencies [70c4523]
2681
+ - Updated dependencies [555b4ec]
2682
+ - Updated dependencies [64f1cf1]
2683
+ - Updated dependencies [da5e4f6]
2684
+ - Updated dependencies [1ccfc23]
2685
+ - Updated dependencies [542718f]
2686
+ - Updated dependencies [7f27bc5]
2687
+ - Updated dependencies [0a174f3]
2688
+ - Updated dependencies [cc00c59]
2689
+ - Updated dependencies [676f677]
2690
+ - Updated dependencies [f95b140]
2691
+ - Updated dependencies [541ce4e]
2692
+ - Updated dependencies [6479086]
2693
+ - Updated dependencies [d79f525]
2694
+ - Updated dependencies [d1865d2]
2695
+ - Updated dependencies [88a629d]
2696
+ - Updated dependencies [cdd2542]
2697
+ - Updated dependencies [ab77513]
2698
+ - Updated dependencies [55ba3ff]
2699
+ - Updated dependencies [0b138da]
2700
+ - Updated dependencies [3ecc369]
2701
+ - Updated dependencies [f1190b0]
2702
+ - Updated dependencies [561abef]
2703
+ - Updated dependencies [ef52001]
2704
+ - Updated dependencies [6a4680b]
2705
+ - Updated dependencies [c3a4273]
2706
+ - Updated dependencies [abf710d]
2707
+ - Updated dependencies [093af32]
2708
+ - Updated dependencies [6df26f0]
2709
+ - Updated dependencies [1bd1be7]
2710
+ - Updated dependencies [d234fa9]
2711
+ - Updated dependencies [adf5812]
2712
+ - Updated dependencies [0eaed83]
2713
+ - Updated dependencies [e36acd4]
2714
+ - Updated dependencies [5058336]
2715
+ - Updated dependencies [2f6b2bf]
2716
+ - Updated dependencies [2028b31]
2717
+ - Updated dependencies [16a1a51]
2718
+ - Updated dependencies [63601ab]
2719
+ - Updated dependencies [c372b29]
2720
+ - Updated dependencies [152f0a7]
2721
+ - Updated dependencies [8693b85]
2722
+ - Updated dependencies [e82dad1]
2723
+ - Updated dependencies [58b7b3d]
2724
+ - Updated dependencies [e77a003]
2725
+ - Updated dependencies [84defab]
2726
+ - Updated dependencies [681d3f1]
2727
+ - Updated dependencies [969d4f2]
2728
+ - Updated dependencies [88561fd]
2729
+ - Updated dependencies [f3bc481]
2730
+ - Updated dependencies [b79aac2]
2731
+ - Updated dependencies [93fc0e7]
2732
+ - Updated dependencies [0601af1]
2733
+ - Updated dependencies [a4b723f]
2734
+ - Updated dependencies [2b10ca0]
2735
+ - Updated dependencies [7db4a81]
2736
+ - Updated dependencies [19a0b0e]
2737
+ - Updated dependencies [526fc11]
2738
+ - Updated dependencies [f8e3e9a]
2739
+ - Updated dependencies [b9d47ec]
2740
+ - Updated dependencies [3b6bc69]
2741
+ - Updated dependencies [6214db6]
2742
+ - Updated dependencies [6732df4]
2743
+ - Updated dependencies [fe9e0d0]
2744
+ - Updated dependencies [63fb72c]
2745
+ - Updated dependencies [804831c]
2746
+ - Updated dependencies [9f5c017]
2747
+ - Updated dependencies [c271413]
2748
+ - Updated dependencies [279e48e]
2749
+ - Updated dependencies [4784bb3]
2750
+ - Updated dependencies [8700d6d]
2751
+ - Updated dependencies [8db2a0f]
2752
+ - Updated dependencies [689953a]
2753
+ - Updated dependencies [30443fb]
2754
+ - Updated dependencies [8d3dbb2]
2755
+ - Updated dependencies [efc1c9c]
2756
+ - Updated dependencies [7d6439c]
2757
+ - Updated dependencies [da45e6b]
2758
+ - Updated dependencies [7533465]
2759
+ - Updated dependencies [835f0f3]
2760
+ - Updated dependencies [6d5db7b]
2761
+ - Updated dependencies [a9d97be]
2762
+ - Updated dependencies [ed35b44]
2763
+ - Updated dependencies [e6040ef]
2764
+ - Updated dependencies [9ba7e9c]
2765
+ - Updated dependencies [729e851]
2766
+ - Updated dependencies [96919a4]
2767
+ - Updated dependencies [345e24a]
2768
+ - Updated dependencies [3bc1bb4]
2769
+ - Updated dependencies [20b507a]
2770
+ - Updated dependencies [2e471dc]
2771
+ - Updated dependencies [6748587]
2772
+ - Updated dependencies [be50942]
2773
+ - Updated dependencies [775e079]
2774
+ - Updated dependencies [7e8b3c0]
2775
+ - Updated dependencies [53374dc]
2776
+ - Updated dependencies [f6fb83f]
2777
+ - Updated dependencies [2049b03]
2778
+ - Updated dependencies [2bf34f7]
2779
+ - Updated dependencies [15b33ae]
2780
+ - Updated dependencies [7cbc724]
2781
+ - Updated dependencies [4a94c38]
2782
+ - Updated dependencies [7098eed]
2783
+ - Updated dependencies [3df7c5c]
2784
+ - Updated dependencies [fb91ac9]
2785
+ - Updated dependencies [fb91ac9]
2786
+ - Updated dependencies [641fb55]
2787
+ - Updated dependencies [8524372]
2788
+ - Updated dependencies [7cbefa5]
2789
+ - Updated dependencies [72d6587]
2790
+ - Updated dependencies [a272a4f]
2791
+ - Updated dependencies [55f39ee]
2792
+ - Updated dependencies [502eb58]
2793
+ - Updated dependencies [0ce32d5]
2794
+ - Updated dependencies [0970a0e]
2795
+ - Updated dependencies [e427e9c]
2796
+ - Updated dependencies [bbc9dc3]
2797
+ - Updated dependencies [02f1813]
2798
+ - Updated dependencies [1ef89c0]
2799
+ - Updated dependencies [ba0b61a]
2800
+ - Updated dependencies [ba0b61a]
2801
+ - Updated dependencies [ba0b61a]
2802
+ - Updated dependencies [ac716ff]
2803
+ - Updated dependencies [e05553c]
2804
+ - Updated dependencies [697aabc]
2805
+ - Updated dependencies [f0f3cd5]
2806
+ - Updated dependencies [ab856ed]
2807
+ - Updated dependencies [f0f2046]
2808
+ - Updated dependencies [20f3e65]
2809
+ - Updated dependencies [bbba098]
2810
+ - Updated dependencies [87af769]
2811
+ - Updated dependencies [3be720e]
2812
+ - Updated dependencies [80a0ecd]
2813
+ - Updated dependencies [43c0d17]
2814
+ - Updated dependencies [c3df43a]
2815
+ - Updated dependencies [d16d0e9]
2816
+ - Updated dependencies [bbe57fd]
2817
+ - Updated dependencies [272a530]
2818
+ - Updated dependencies [462bafb]
2819
+ - Updated dependencies [1779e8d]
2820
+ - Updated dependencies [9aa2a57]
2821
+ - Updated dependencies [f7fcc2c]
2822
+ - Updated dependencies [f0f4d6c]
2823
+ - Updated dependencies [4128188]
2824
+ - Updated dependencies [b253c4e]
2825
+ - Updated dependencies [78a9c67]
2826
+ - Updated dependencies [2e97c8c]
2827
+ - Updated dependencies [4a7ef0d]
2828
+ - Updated dependencies [4598f6d]
2829
+ - Updated dependencies [dea17b4]
2830
+ - Updated dependencies [89bb77a]
2831
+ - Updated dependencies [06611e4]
2832
+ - Updated dependencies [44152c4]
2833
+ - Updated dependencies [3939545]
2834
+ - Updated dependencies [66abbde]
2835
+ - Updated dependencies [dc3893d]
2836
+ - Updated dependencies [1bbaa16]
2837
+ - Updated dependencies [6ee259a]
2838
+ - Updated dependencies [7649f43]
2839
+ - Updated dependencies [d0f52e4]
2840
+ - Updated dependencies [e708426]
2841
+ - Updated dependencies [33e1697]
2842
+ - Updated dependencies [3b6d53b]
2843
+ - Updated dependencies [e22fa12]
2844
+ - Updated dependencies [1560d46]
2845
+ - Updated dependencies [a017617]
2846
+ - Updated dependencies [276d174]
2847
+ - Updated dependencies [2982ed9]
2848
+ - Updated dependencies [741864f]
2849
+ - Updated dependencies [a8198de]
2850
+ - Updated dependencies [0c789a4]
2851
+ - Updated dependencies [05a49f2]
2852
+ - Updated dependencies [b234a84]
2853
+ - Updated dependencies [a78cd37]
2854
+ - Updated dependencies [5ea623e]
2855
+ - Updated dependencies [4d7d322]
2856
+ - Updated dependencies [dc49246]
2857
+ - Updated dependencies [5eabe86]
2858
+ - Updated dependencies [ca5d671]
2859
+ - Updated dependencies [32bf2d6]
2860
+ - Updated dependencies [ff0c384]
2861
+ - Updated dependencies [af4fb29]
2862
+ - Updated dependencies [c698a81]
2863
+ - Updated dependencies [ff5ef1c]
2864
+ - Updated dependencies [befd40c]
2865
+ - Updated dependencies [905913c]
2866
+ - Updated dependencies [9a97800]
2867
+ - Updated dependencies [6358a2d]
2868
+ - Updated dependencies [6bca0e4]
2869
+ - Updated dependencies [81c0bc4]
2870
+ - Updated dependencies [3c76801]
2871
+ - Updated dependencies [d06fba8]
2872
+ - Updated dependencies [60500cb]
2873
+ - Updated dependencies [2fcefb9]
2874
+ - Updated dependencies [77f846a]
2875
+ - Updated dependencies [bc5870c]
2876
+ - Updated dependencies [b55a346]
2877
+ - Updated dependencies [065bba7]
2878
+ - Updated dependencies [f760064]
2879
+ - Updated dependencies [dd19463]
2880
+ - Updated dependencies [6791717]
2881
+ - Updated dependencies [8ea3bee]
2882
+ - Updated dependencies [100547e]
2883
+ - Updated dependencies [3a58149]
2884
+ - Updated dependencies [6d1c155]
2885
+ - Updated dependencies [d7573b3]
2886
+ - Updated dependencies [bf3edfe]
2887
+ - Updated dependencies [2c8474c]
2888
+ - Updated dependencies [6ce89da]
2889
+ - Updated dependencies [0e05aac]
2890
+ - Updated dependencies [ae61ad4]
2891
+ - Updated dependencies [5aed9e4]
2892
+ - Updated dependencies [83c77dc]
2893
+ - Updated dependencies [3c9fca3]
2894
+ - Updated dependencies [18a8e7d]
2895
+ - Updated dependencies [e7957ab]
2896
+ - Updated dependencies [f7e34ca]
2897
+ - Updated dependencies [e719ebd]
2898
+ - Updated dependencies [516583b]
2899
+ - Updated dependencies [f9e4f91]
2900
+ - Updated dependencies [6ef48b1]
2901
+ - Updated dependencies [58be55e]
2902
+ - Updated dependencies [fa429cf]
2903
+ - Updated dependencies [ed8df3e]
2904
+ - Updated dependencies [fe76ece]
2905
+ - Updated dependencies [8b446f5]
2906
+ - Updated dependencies [8e74b27]
2907
+ - Updated dependencies [7102b20]
2908
+ - Updated dependencies [8ebd57f]
2909
+ - Updated dependencies [968dc1e]
2910
+ - Updated dependencies [9a1fb41]
2911
+ - Updated dependencies [617707a]
2912
+ - Updated dependencies [c40f3b8]
2913
+ - Updated dependencies [58770f3]
2914
+ - Updated dependencies [aefe428]
2915
+ - Updated dependencies [485f096]
2916
+ - Updated dependencies [7357447]
2917
+ - Updated dependencies [199d31b]
2918
+ - Updated dependencies [b655a9d]
2919
+ - Updated dependencies [a865c73]
2920
+ - Updated dependencies [3e01cb5]
2921
+ - Updated dependencies [7138bc1]
2922
+ - Updated dependencies [cef27e2]
2923
+ - Updated dependencies [4e8622b]
2924
+ - Updated dependencies [dffd752]
2925
+ - Updated dependencies [06973aa]
2926
+ - Updated dependencies [50798f3]
2927
+ - Updated dependencies [6a576c9]
2928
+ - Updated dependencies [0b12a33]
2929
+ - Updated dependencies [105f3c5]
2930
+ - Updated dependencies [3ccd9e8]
2931
+ - Updated dependencies [689b979]
2932
+ - Updated dependencies [c70f865]
2933
+ - Updated dependencies [e546222]
2934
+ - Updated dependencies [fd13f52]
2935
+ - Updated dependencies [d7bd274]
2936
+ - Updated dependencies [98c3a74]
2937
+ - Updated dependencies [fffa30d]
2938
+ - Updated dependencies [e4e9557]
2939
+ - Updated dependencies [7a28e1e]
2940
+ - Updated dependencies [ebce5a3]
2941
+ - Updated dependencies [fb336df]
2942
+ - Updated dependencies [6c1b105]
2943
+ - Updated dependencies [4dc80d0]
2944
+ - Updated dependencies [9d9040d]
2945
+ - Updated dependencies [20e317c]
2946
+ - Updated dependencies [0fce2ef]
2947
+ - Updated dependencies [42df928]
2948
+ - Updated dependencies [0e2ddd4]
2949
+ - Updated dependencies [b7479ab]
2950
+ - Updated dependencies [9850c6e]
2951
+ - Updated dependencies [de570cc]
2952
+ - Updated dependencies [b2ea297]
2953
+ - Updated dependencies [5b5a5c3]
2954
+ - Updated dependencies [14582b8]
2955
+ - Updated dependencies [51e144e]
2956
+ - Updated dependencies [19cbf10]
2957
+ - Updated dependencies [b6e83be]
2958
+ - Updated dependencies [7e50e84]
2959
+ - Updated dependencies [ab92940]
2960
+ - Updated dependencies [a691c0b]
2961
+ - Updated dependencies [0b1326d]
2962
+ - Updated dependencies [1e66879]
2963
+ - Updated dependencies [c5200f0]
2964
+ - Updated dependencies [af3861f]
2965
+ - Updated dependencies [2a79e84]
2966
+ - Updated dependencies [2609812]
2967
+ - Updated dependencies [515f171]
2968
+ - Updated dependencies [1f4e029]
2969
+ - Updated dependencies [4f14ad7]
2970
+ - Updated dependencies [258d264]
2971
+ - Updated dependencies [cac64b3]
2972
+ - Updated dependencies [4bb940b]
2973
+ - Updated dependencies [17fbbaf]
2974
+ - Updated dependencies [d8cf1cb]
2975
+ - Updated dependencies [0d1e702]
2976
+ - Updated dependencies [b03ba3a]
2977
+ - Updated dependencies [0068348]
2978
+ - Updated dependencies [641543f]
2979
+ - Updated dependencies [8a44390]
2980
+ - Updated dependencies [8033ad1]
2981
+ - Updated dependencies [fa140b8]
2982
+ - Updated dependencies [71cba28]
2983
+ - Updated dependencies [190fbd0]
2984
+ - Updated dependencies [c00bf28]
2985
+ - Updated dependencies [23705b7]
2986
+ - Updated dependencies [93127bd]
2987
+ - Updated dependencies [f2158ec]
2988
+ - Updated dependencies [759606e]
2989
+ - Updated dependencies [fd8dace]
2990
+ - Updated dependencies [72ffc34]
2991
+ - Updated dependencies [a51fa0c]
2992
+ - Updated dependencies [51f3d8d]
2993
+ - Updated dependencies [bf28341]
2994
+ - Updated dependencies [78cbdb5]
2995
+ - Updated dependencies [b7543a9]
2996
+ - Updated dependencies [6c6cee7]
2997
+ - Updated dependencies [42887e0]
2998
+ - Updated dependencies [f1690d4]
2999
+ - Updated dependencies [83fe6e7]
3000
+ - Updated dependencies [d1ab06f]
3001
+ - Updated dependencies [38a9568]
3002
+ - Updated dependencies [f90b8fb]
3003
+ - Updated dependencies [91783c4]
3004
+ - Updated dependencies [982885d]
3005
+ - Updated dependencies [dba7d84]
3006
+ - Updated dependencies [ca39427]
3007
+ - Updated dependencies [bd09957]
3008
+ - Updated dependencies [5a07e67]
3009
+ - Updated dependencies [2d36552]
3010
+ - Updated dependencies [45d8288]
3011
+ - Updated dependencies [b2437a7]
3012
+ - Updated dependencies [f157423]
3013
+ - Updated dependencies [7a90afd]
3014
+ - Updated dependencies [eddc1dd]
3015
+ - Updated dependencies [490f482]
3016
+ - Updated dependencies [27308c5]
3017
+ - Updated dependencies [8689166]
3018
+ - Updated dependencies [c9327c9]
3019
+ - Updated dependencies [920165d]
3020
+ - Updated dependencies [9101be5]
3021
+ - Updated dependencies [f53a8d0]
3022
+ - Updated dependencies [30266cf]
3023
+ - Updated dependencies [968dc1e]
3024
+ - Updated dependencies [57f9b07]
3025
+ - Updated dependencies [3c73d99]
3026
+ - Updated dependencies [d91aed9]
3027
+ - Updated dependencies [ed71d9e]
3028
+ - Updated dependencies [7776fc2]
3029
+ - Updated dependencies [e76634c]
3030
+ - Updated dependencies [c86185e]
3031
+ - Updated dependencies [fb96ecb]
3032
+ - Updated dependencies [1170ed1]
3033
+ - Updated dependencies [92814db]
3034
+ - Updated dependencies [4d73b07]
3035
+ - @object-ui/plugin-detail@17.7.0
3036
+ - @object-ui/react@17.7.0
3037
+ - @object-ui/core@17.7.0
3038
+ - @object-ui/types@17.7.0
3039
+ - @object-ui/i18n@17.7.0
3040
+ - @object-ui/components@17.7.0
3041
+ - @object-ui/fields@17.7.0
3042
+ - @object-ui/permissions@17.7.0
3043
+
3044
+ ## 17.6.0
3045
+
3046
+ ### Patch Changes
3047
+
3048
+ - 5edc0c5: `object-gantt` / `object-map` / `object-calendar` no longer drop a sort entry that omits `order`.
3049
+
3050
+ The three blocks each inlined a byte-identical private copy of the `sort` →
3051
+ `$orderby` conversion. That copy required BOTH `field` and `order` on an array
3052
+ entry and silently skipped any entry missing one, so a stored view sorting by
3053
+ `[{ field: 'amount' }]` reached the wire with no ordering at all — the authored
3054
+ sort key was lost, not applied. The same copy already treated the STRING
3055
+ spelling `"amount"` as ascending, so this was an inconsistency between two
3056
+ spellings of one thing rather than deliberate strictness.
3057
+
3058
+ All three now import the shared `convertSortToQueryParams` sink from
3059
+ `@object-ui/core` (introduced by objectstack#7137, already used by
3060
+ `object-timeline` and `record:line_items`), and the private copies are gone —
3061
+ the sink is the repo's only definition. Two behavior changes come with it, both
3062
+ of which make the blocks more faithful to what is already declared rather than
3063
+ more tolerant:
3064
+
3065
+ - An array entry that omits `order` now orders ASCENDING instead of vanishing.
3066
+ That is what `QueryParams.$orderby`'s own member shape
3067
+ (`{ field: string; order?: 'asc' | 'desc' }`) says, and what
3068
+ `@object-ui/data-objectstack`'s `serializeOrderBy` already did with a missing
3069
+ direction.
3070
+ - When nothing orderable was authored, the query now carries no `$orderby` at
3071
+ all instead of an empty object. `{}` is truthy and meant "no ordering" only by
3072
+ accident of the adapter's serializer.
3073
+
3074
+ Reachability, so the size of this is not overstated: `SortConfig.order` and
3075
+ `ElementDataSourceSort.order` are REQUIRED in objectui's own types, so a typed
3076
+ caller could never author the dropped shape. The affected surface is untyped
3077
+ stored view metadata (`ElementSavedView` is a loose record by design) — which is
3078
+ exactly where an order-less entry can arrive today.
3079
+ - 6098ecd: plugin-gantt README: the `onTaskUpdate` drag example no longer writes blank dates on a progress drag.
3080
+
3081
+ `GanttViewProps.onTaskUpdate`'s second parameter is
3082
+ `Partial< Pick< GanttTask, 'title' | 'start' | 'end' | 'progress' > >`
3083
+ (`src/GanttView.tsx:345`), so the destructured `start` / `end` are
3084
+ `Date | undefined`. The README's "Drag-and-drop rescheduling" example destructured
3085
+ them and passed both straight to `save(...)`, under a comment asserting they are
3086
+ always real `Date` objects. Both layers of that assertion were wrong.
3087
+
3088
+ The runtime half is the one that mattered. `onTaskUpdate` is the single exit for
3089
+ every edit path, and the progress grip commits changes with **no** dates at all —
3090
+ `commitTaskUpdates([{ task, changes: { progress: cur.value } }])`
3091
+ (`src/GanttView.tsx:1335`), forwarded verbatim by `onTaskUpdate(task, changes)`
3092
+ (`:1091`). A host that copied the example therefore called
3093
+ `save(task.id, { start: undefined, end: undefined })` on every progress drag,
3094
+ blanking the record's start and end dates. Drag is documented as opt-in via
3095
+ `onTaskUpdate` alone and progress drag needs no extra switch, so the path was
3096
+ reachable by default rather than a corner configuration.
3097
+
3098
+ The example now guards with `if (!start || !end) return;` and its comment states
3099
+ the real shape — that only the keys an edit touched are present, and that the
3100
+ progress grip sends just `{ progress }`. Documentation only; no renderer behavior
3101
+ changed.
3102
+ - bb3fab6: Docs only: `packages/plugin-gantt/README.md` no longer teaches two identifiers the
3103
+ package does not export, nor a task shape it does not produce (objectui#5012).
3104
+ Each README import was judged against the entry module's real export surface
3105
+ (35 names, read from the build product's `dist/index.d.ts`), and every corrected
3106
+ snippet was type-checked against that same build product:
3107
+
3108
+ - **`ganttComponents`** — taught as a components map to iterate over for "manual
3109
+ registration" (`Object.entries(ganttComponents).forEach(...)`). It does not
3110
+ exist anywhere in the package, so the snippet was `Object.entries(undefined)`:
3111
+ a `TypeError` on the first line a reader copied. Registration is *only* the
3112
+ side effect of importing the entry point, which runs the two
3113
+ `ComponentRegistry.register(...)` calls in `src/index.tsx`. The section is
3114
+ replaced by what actually happens: the schema types those calls claim
3115
+ (`object-gantt` → `plugin-gantt:object-gantt`, `gantt` → `view:gantt`, both
3116
+ with a bare-`type` fallback), the package's real export surface, and — for the
3117
+ use case the old snippet was reaching for — registering the exported
3118
+ `ObjectGanttRenderer` under a key of your own.
3119
+
3120
+ - **`GanttSchema`** — taught as the component schema type in the TypeScript
3121
+ section. Pure fiction: zero hits in this package and in `@object-ui/types`
3122
+ (a plain grep appears to find it only as a substring of `ObjectGanttSchema`;
3123
+ under a word boundary it has no hits at all). The authored type does exist
3124
+ under its real name, so the example is rewritten around it rather than
3125
+ dropped: `ObjectGanttSchema` from `@object-ui/types`, which is
3126
+ **record-driven** — `type: 'object-gantt'` plus an object name and the fields
3127
+ to read. It never carried the `tasks` array the old snippet assigned to it.
3128
+ No export was added to make the old name true.
3129
+
3130
+ - **`GanttTask`** — the one real name of the three, and the reason the section
3131
+ still failed to compile. The documented shape had drifted from the exported
3132
+ type on three counts: the label field is `title`, not `name`; `start`/`end`
3133
+ are `Date` objects, not ISO strings; and `color` is a CSS color, not a
3134
+ Tailwind class. Both the "Task Structure" reference block and the typed
3135
+ example now match the exported declaration, and the reference block is pinned
3136
+ against it in both assignment directions so a future drift fails a check
3137
+ instead of compiling as an unrelated local interface.
3138
+
3139
+ No code, types or runtime behaviour change — the diff is one README and this
3140
+ changeset. The correction reaches npm with the package's next publish, which is
3141
+ why it declares a patch: `README.md` is in the package's published `files`.
3142
+ - 449ffe8: Fix the `GanttViewMode` JSDoc to name all five granularities (objectui#5132).
3143
+
3144
+ The comment above `export type GanttViewMode` said "one column per day, week,
3145
+ month, or quarter" while the type itself, `VIEW_MODES`, `NOMINAL_DAYS`
3146
+ (`year: 365.25`), the column builder, the toolbar and the header-band logic
3147
+ have honored a fifth member, `'year'`, all along — `'year'` was fully live,
3148
+ just undocumented. Doc-only change, no behavior difference.
3149
+ - Updated dependencies [88085e3]
3150
+ - Updated dependencies [69251bf]
3151
+ - Updated dependencies [57e668f]
3152
+ - Updated dependencies [516663d]
3153
+ - Updated dependencies [41ac1b7]
3154
+ - Updated dependencies [1eaf0a1]
3155
+ - Updated dependencies [7c297e3]
3156
+ - Updated dependencies [a09bc33]
3157
+ - Updated dependencies [460c4d0]
3158
+ - Updated dependencies [0ae27f7]
3159
+ - Updated dependencies [2533ec5]
3160
+ - Updated dependencies [78c0f9a]
3161
+ - Updated dependencies [bbe8b86]
3162
+ - Updated dependencies [8477be5]
3163
+ - Updated dependencies [279fb13]
3164
+ - Updated dependencies [2e82ab2]
3165
+ - Updated dependencies [ad07b65]
3166
+ - Updated dependencies [41f498b]
3167
+ - Updated dependencies [ef0d150]
3168
+ - Updated dependencies [f34226e]
3169
+ - Updated dependencies [564b605]
3170
+ - Updated dependencies [e1d4251]
3171
+ - Updated dependencies [40d3a33]
3172
+ - Updated dependencies [8b9dc62]
3173
+ - Updated dependencies [1184192]
3174
+ - Updated dependencies [a2a9747]
3175
+ - Updated dependencies [65e88e6]
3176
+ - Updated dependencies [a1609a6]
3177
+ - Updated dependencies [53f23bc]
3178
+ - Updated dependencies [c4533dc]
3179
+ - Updated dependencies [be60815]
3180
+ - Updated dependencies [37f6844]
3181
+ - Updated dependencies [93de4f6]
3182
+ - Updated dependencies [2b50261]
3183
+ - Updated dependencies [384f30d]
3184
+ - Updated dependencies [ac600e5]
3185
+ - Updated dependencies [97fba31]
3186
+ - Updated dependencies [232f61a]
3187
+ - Updated dependencies [d374caf]
3188
+ - Updated dependencies [5673576]
3189
+ - Updated dependencies [c1ef923]
3190
+ - Updated dependencies [911ceaa]
3191
+ - Updated dependencies [98eab36]
3192
+ - Updated dependencies [af5e292]
3193
+ - Updated dependencies [3fbbea1]
3194
+ - Updated dependencies [0bffb18]
3195
+ - Updated dependencies [800f455]
3196
+ - Updated dependencies [5458414]
3197
+ - Updated dependencies [3241559]
3198
+ - Updated dependencies [7f96b10]
3199
+ - Updated dependencies [167ec42]
3200
+ - Updated dependencies [616a2a5]
3201
+ - Updated dependencies [6c68b13]
3202
+ - Updated dependencies [0046d8f]
3203
+ - Updated dependencies [f1d4748]
3204
+ - Updated dependencies [bea374e]
3205
+ - Updated dependencies [b1119ec]
3206
+ - Updated dependencies [5607092]
3207
+ - Updated dependencies [9f23d2b]
3208
+ - Updated dependencies [578e025]
3209
+ - Updated dependencies [af025ee]
3210
+ - Updated dependencies [d109a4d]
3211
+ - Updated dependencies [598c89a]
3212
+ - Updated dependencies [4a0bd17]
3213
+ - Updated dependencies [b8b9af4]
3214
+ - Updated dependencies [31676be]
3215
+ - Updated dependencies [8c0d52e]
3216
+ - Updated dependencies [aff10e2]
3217
+ - Updated dependencies [70a774b]
3218
+ - Updated dependencies [7dd93c0]
3219
+ - Updated dependencies [229b17e]
3220
+ - Updated dependencies [9ce096f]
3221
+ - Updated dependencies [e05db88]
3222
+ - Updated dependencies [7458a41]
3223
+ - Updated dependencies [ad13d63]
3224
+ - Updated dependencies [5ffcc14]
3225
+ - Updated dependencies [d971e51]
3226
+ - Updated dependencies [97abb24]
3227
+ - Updated dependencies [deb157a]
3228
+ - Updated dependencies [9c60144]
3229
+ - Updated dependencies [e7747f1]
3230
+ - Updated dependencies [d2ce342]
3231
+ - Updated dependencies [9695da7]
3232
+ - Updated dependencies [ac2f332]
3233
+ - Updated dependencies [a777058]
3234
+ - Updated dependencies [75444e3]
3235
+ - Updated dependencies [58b8346]
3236
+ - Updated dependencies [2d0bd16]
3237
+ - Updated dependencies [a9e17b4]
3238
+ - Updated dependencies [b8ce7dc]
3239
+ - Updated dependencies [dad51e5]
3240
+ - Updated dependencies [1c9c342]
3241
+ - Updated dependencies [787c738]
3242
+ - Updated dependencies [8396656]
3243
+ - Updated dependencies [dbbd38a]
3244
+ - Updated dependencies [8871c14]
3245
+ - Updated dependencies [93fe362]
3246
+ - Updated dependencies [dfc6975]
3247
+ - Updated dependencies [3cf4de0]
3248
+ - Updated dependencies [c9dc811]
3249
+ - Updated dependencies [144ef9b]
3250
+ - Updated dependencies [138ab04]
3251
+ - Updated dependencies [a0b9e91]
3252
+ - Updated dependencies [99bd015]
3253
+ - Updated dependencies [21e4585]
3254
+ - @object-ui/types@17.6.0
3255
+ - @object-ui/fields@17.6.0
3256
+ - @object-ui/i18n@17.6.0
3257
+ - @object-ui/react@17.6.0
3258
+ - @object-ui/plugin-detail@17.6.0
3259
+ - @object-ui/components@17.6.0
3260
+ - @object-ui/core@17.6.0
3261
+
3
3262
  ## 17.5.0
4
3263
 
5
3264
  ### Patch Changes