Skip to content

Commit 597020a

Browse files
huangyiireneclaude
andauthored
docs(skills): objectstack-ui factual sweep — 7 false behavioral claims corrected (#13777)
Flight ⑤ of the published-skills factual sweep. Every correction is settled against the implementation (spec Zod schemas in this repo; @object-ui renderer sources probed read-only in objectui), never against another document. Three of the seven are one class: "silently dropped" claims that outlived the protocol-17 strict-unknown-keys cutover, where the schema now REJECTS by name. Net -12 tokens / -2 lines; no ratchet ceiling touched. Part of #13658 Claude-Session: https://claude.ai/code/session_01EnE7G31tqbxN1rqpQmzurT Co-authored-by: Claude <noreply@anthropic.com>
1 parent 878aa2e commit 597020a

1 file changed

Lines changed: 22 additions & 24 deletions

File tree

skills/objectstack-ui/SKILL.md

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ App navigation, Dashboards, Reports, and Actions.
6060
| `map` | Geospatial records with `location` fields |
6161
| `chart` | Aggregate visualisation over the object (mini chart view) |
6262
| `tree` | Self-referencing hierarchy (tree-grid) |
63+
| `page` | Mounts a published Page (`pageName`); no rows of its own |
6364

6465
### Form Views
6566

@@ -322,11 +323,11 @@ Rules:
322323
Want both demos? Put them on different views.
323324
- **On an object list view (`*.view.ts` `list` / `listViews`), only
324325
`element: 'dropdown'` (value chips) is allowed — `tabs` is page-only**
325-
(ADR-0047 amendment). An object view's
326-
saved-view `ViewTabBar` already owns the tab-bar role, so a `tabs`
327-
user-filter would render a second, colliding tab bar. The spec narrows it
328-
(`ObjectUserFiltersSchema` — a `tabs` element is untypable at author time
329-
and dropped at parse) and the `validate` list-view-mode lint reports it.
326+
(ADR-0047 amendment). An object view's saved-view `ViewTabBar` already owns
327+
the tab-bar role, so a `tabs` user-filter would render a second, colliding
328+
tab bar. The spec narrows it (`ObjectUserFiltersSchema` — a `tabs` element is
329+
untypable at author time and **rejected** at parse, not dropped) and the
330+
`validate` list-view-mode lint reports it.
330331
Need named presets on an object? Add a `listViews` entry instead. The full
331332
`dropdown | tabs | toggle` range applies only to **page lists** /
332333
`interfaceConfig.userFilters` (the block above).
@@ -558,7 +559,7 @@ Field shapes:
558559
| `bands[].label` | yes | Header text for the band (白班 / 夜班). |
559560
| `bands[].start` / `bands[].end` | yes | `'HH:mm'`. When `end <= start` the band crosses midnight. Bands must tile the 24h day from `dayStart`. |
560561
| `bands[].color` | no | Any CSS color. Tints that band's column; **omit for no tint**. |
561-
| `showMidnight` | no | Draw the dashed calendar-midnight cue inside cross-midnight bands. Default `true`; set `false` to hide it. |
562+
| `showMidnight` | no | Draw the dashed local-0:00 cue inside cross-midnight bands (the 排班日 cell itself stays unbroken). Default `true`; set `false` to hide it. |
562563

563564
Behavior:
564565

@@ -570,11 +571,7 @@ Behavior:
570571
in, so a 夜班 spanning 20:00→次日08:00 stays in a single column.
571572
- **Drag-snaps to band boundaries** (the band duration, e.g. 12h) instead of
572573
whole days.
573-
- **Calendar-midnight cue.** A subtle dashed vertical line marks local 0:00
574-
*inside* a cross-midnight band — the 排班日 cell itself stays unbroken. Set
575-
`showMidnight: false` to turn it off.
576-
- **Default off = zero regression.** Omit `timeSegments` and the gantt behaves
577-
exactly as before. Tints render only for bands that declare `color`.
574+
- **Default off.** Omit `timeSegments` and the gantt renders unsegmented.
578575

579576
---
580577

@@ -669,6 +666,7 @@ A widget's `type` is its **chart type** (`ChartTypeSchema`; defaults to
669666
| Single value | `metric`, `kpi`, `gauge`, `solid-gauge`, `bullet` (all render the number today; gauge variants gain a dial when a gauge renderer lands) |
670667
| Comparison | `bar`, `horizontal-bar`, `column` |
671668
| Trend | `line`, `area` |
669+
| Mixed | `combo` (bar/line/area on shared dual axes) |
672670
| Distribution | `pie`, `donut`, `funnel` |
673671
| Relationship | `scatter` |
674672
| Composition | `treemap`, `sankey` |
@@ -688,9 +686,9 @@ dashboard widget, a report, and a list `type:'chart'` view all **bind a `dataset
688686
and select named `dimensions` + `values`**; the dataset owns the base object,
689687
allowed joins, intrinsic filter, dimensions, and certified measures. The legacy
690688
per-widget inline query (`object` + `categoryField` + `valueField` + `aggregate`)
691-
**was removed** — a widget now requires `dataset` + `values`; the inline fields are
692-
dropped and a widget lacking `dataset` fails `os validate`. Reports bind the same
693-
way (`dataset` + `rows` + `values` + `runtimeFilter`). The dataset shape is
689+
**was removed** — a widget now requires `dataset` + `values`; the closed schema
690+
REJECTS the inline keys by name, and one lacking `dataset` fails `os validate`.
691+
Reports bind the same way (`dataset` + `rows` + `values` + `runtimeFilter`). The dataset shape is
694692
`DatasetSchema` — see `node_modules/@objectstack/spec/src/ui/dataset.zod.ts`.
695693

696694
A widget's presentation-scope `filter` flows into the query as the runtime
@@ -1523,9 +1521,9 @@ compareTo: { kind: 'previousYear', dimension: 'close_date' } // several —
15231521
and overwrites it.
15241522
* **Cartesian charts** (`line` / `area` / `bar` / `horizontal-bar` /
15251523
`scatter`) — the comparison series is appended after the primary series
1526-
with `variant: 'comparison'` and styled as a muted overlay (`opacity: 0.5`
1527-
+ `strokeDasharray: '4 4'` for line/area/scatter; `opacity: 0.4` for
1528-
bars). Override per-series with `series.dashArray` / `series.opacity`.
1524+
with `variant: 'comparison'`, muted per family (dashed `'4 4'` on
1525+
line/area only; reduced opacity on all). Override per-series with
1526+
`series.dashArray` / `series.opacity`.
15291527
* **Pie / donut / funnel**`compareTo` is silently ignored; there is no
15301528
meaningful "two-period" composition for part-of-whole charts.
15311529
* **Requirements** — a comparison needs a **dated window** to shift. When the
@@ -1663,12 +1661,12 @@ Both `{token}` and `${token}` forms are accepted.
16631661
| Instants | `today`, `yesterday`, `tomorrow`, `now` |
16641662
| Current period | `current_week_start` / `_end`, `current_month_start` / `_end`, `current_quarter_start` / `_end`, `current_year_start` / `_end` |
16651663
| Last period | `last_week_start` / `_end`, `last_month_start` / `_end`, `last_quarter_start` / `_end`, `last_year_start` / `_end` |
1666-
| Next period | `next_week_start`, `next_month_start`, `next_quarter_start`, `next_year_start` |
1664+
| Next period | `next_week_start` / `_end`, `next_month_start` / `_end`, `next_quarter_start` / `_end`, `next_year_start` / `_end` |
16671665
| Bare aliases | `week_start`, `week_end`, `month_start`, `month_end`, `quarter_start`, `quarter_end`, `year_start`, `year_end` (same as `current_*`) |
16681666

16691667
### Parameterised tokens — `{N_<unit>_(ago|from_now)}`
16701668

1671-
`N` is any positive integer; `<unit>` is one of
1669+
`N` is any non-negative integer; `<unit>` is one of
16721670
`minute(s) | hour(s) | day(s) | week(s) | month(s) | year(s)`.
16731671
`minute`/`hour` resolve to a full ISO timestamp; coarser units resolve to
16741672
`YYYY-MM-DD`.
@@ -2053,11 +2051,11 @@ the selected row in `list_item` contexts.
20532051
"My Records" filter using `$currentUser`.
20542052

20552053
5. **Putting widget grid placement in `position`.**
2056-
The grid-placement field is `layout: { x, y, w, h }`there is no
2057-
`position` key on a widget, so a `position` object is silently dropped.
2058-
`layout` is optional: omit it and the widget auto-flows (the Studio
2059-
designer relies on this); set it only when you want an explicit grid
2060-
position.
2054+
The grid-placement field is `layout: { x, y, w, h }``position` is not a
2055+
widget key and the closed schema REJECTS it by name (it was silently
2056+
dropped before protocol 17). `layout` is optional: omit it and the widget
2057+
auto-flows (the Studio designer relies on this); set it only when you want
2058+
an explicit grid position.
20612059

20622060
---
20632061

0 commit comments

Comments
 (0)