Repository navigation
docs(skills): put the GanttConfig keys back under the gantt block - #6742
Merged
Merged
Conversation
`skills/objectui/guides/page-builder.md` headed one table "Top-level display /
behavior options (siblings of `gantt` on `props`, not field mappings)" and then
listed two different populations under it. Measured in
`packages/plugin-gantt/src/ObjectGantt.tsx`:
ganttConfig?.X — resourceView(1635) assigneeField(1021,1055)
effortField(1058,1065) capacity(1640) quickFilters(727,1108)
autoZoomToFilter(1297,1305) viewMode(1641,1651)
schema.X — criticalPath(1669) showBaselines(1672) skipWeekends(1071)
holidays(1072) markers(1666) persistLayout(1203)
readOnly(1673,1743) mobileReadOnly(1674)
`getGanttConfig` (line 508) checks `schema.gantt` FIRST and returns the block
whole; the flat top-level face is branch 2 and is reached only when there is no
block. So beside a `gantt` block every key in the first group is read by
nothing. The guide's own worked example was exactly that dead shape — a `gantt`
block plus top-level `quickFilters` / `autoZoomToFilter`.
The split is not an inference from the read sites alone. `ObjectGanttSchema`
(`packages/types/src/zod/objectql.zod.ts`) declares the same two populations by
construction: the first group is taken from `SpecGanttConfigSchema.shape` by
reference (lines 676, 726-731), the second is declared locally (689-707).
Seven keys move, not six. `viewMode` was not named on the card but has the
identical shape — `SpecGanttConfigSchema.shape.viewMode` by reference at line
676, read only as `ganttConfig?.viewMode`, and therefore also in
`FLAT_GANTT_CONFIG_KEYS`, so objectui#6469's dev-mode warning names it when it
is hoisted beside a block. Leaving it behind would have re-shipped the same
false teaching for one key.
Rows move; no teaching prose is added. The last row's "Also usable as field
mappings under `gantt`" is dropped rather than reworded — it was backwards, and
under `gantt` is now where the row itself sits. The true sentence "The gantt
field config may also be hoisted to top-level `props` instead of nesting under
`gantt`" is untouched: "instead of" does real work and describes branch 2.
The node-level table's heading no longer says these keys sit "on `props`". That
phrase contradicted this guide's own rule two sections earlier ("Every key
belongs on the node itself — never in a `props` envelope") and the `schema.X`
read sites; it is not re-authored into the replacement sentence.
Pinned against drift by objectui#6469's warning and
`ObjectGantt.blockPrecedence.test.tsx` ("names GanttConfig keys hoisted beside a
block, with no top-level date pair"). No code companion is owed.
page-builder.md: 510 lines before, 516 after (+6). The six are table
scaffolding for the second table — heading, blank lines, header row, separator.
Row count is unchanged at 13.
Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
os-zhuang
approved these changes
Aug 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #6508
skills/objectui/guides/page-builder.mdheaded one table "Top-level display /behavior options (siblings of
ganttonprops, not field mappings)" and thenlisted two different populations under it. This splits them, moving rows rather
than adding prose.
Read-site verification (measured, not recalled)
packages/plugin-gantt/src/ObjectGantt.tsx, line numbers on546f61099+ this branch:resourceViewganttConfig?.resourceView(1635)assigneeFieldganttConfig?.assigneeField(1021, 1055)effortFieldganttConfig?.effortField(1058, 1065)capacityganttConfig?.capacity ?? 1(1640)quickFiltersganttConfig?.quickFilters(1108), destructured (727)autoZoomToFilterganttConfig?.autoZoomToFilter(1297, 1305)viewModeganttConfig?.viewMode(1641, 1651)criticalPathschema.criticalPath(1669)showBaselinesschema.showBaselines(1672)skipWeekendsschema.skipWeekends(1071)holidaysschema.holidays(1072)markersschema.markers(1666)persistLayoutschema.persistLayout(1203)readOnlyschema.readOnly(1673, 1743)mobileReadOnlyschema.mobileReadOnly(1674)Every read site the card named is confirmed, with one spelling nit:
capacityisganttConfig?.capacity ?? 1, notganttConfig.capacity. Same face either way.getGanttConfig(line 508) checksschema.ganttfirst and returns the blockwhole; the flat top-level face is branch 2 and is reached only when there is no
block and both date fields are present. So beside a
ganttblock, every key inthe GanttConfig group is read by nothing.
The split is not an inference from the read sites alone — the declaration draws
the same line by construction. In
packages/types/src/zod/objectql.zod.ts,ObjectGanttSchematakes the GanttConfig group fromSpecGanttConfigSchema.shapeby reference (lines 676, 726-731) and declares the node group locally
(689-707).
Seven keys move, not six
viewModewas not enumerated on the card but has the identical shape:SpecGanttConfigSchema.shape.viewModeby reference at line 676, read only asganttConfig?.viewMode, and therefore also inFLAT_GANTT_CONFIG_KEYS— soobjectui#6469's dev-mode warning names it when it is hoisted beside a block.
Leaving it in the top-level table would have re-shipped the same false teaching
for one key while fixing it for six. Flagged here rather than filed separately
because it is the same defect in the same table this PR is already rewriting.
Conversely
markers,persistLayoutandmobileReadOnlywere not enumeratedeither and measure as genuinely node-level, so they stay where they sat — the
node-level population is eight rows, not five.
Before / after table structure
Before — one table, 13 rows, heading true for 6 of them:
After — two tables, 13 rows total, unchanged row bodies:
Three further corrections inside that move
assigneeField/effortField/capacityrow ended "Also usable as field mappings undergantt." Underganttis where they work; the row now sits in the gantt-configtable, so the clause is deleted rather than inverted.
ganttblockplus top-level
quickFiltersandautoZoomToFilter— the exact dead shape thecard names. Those two keys move inside the block (a pure move, no line
change). Every remaining top-level key in the example (
criticalPath,skipWeekends,holidays,readOnly) is genuinely node-level, soFLAT_GANTT_CONFIG_KEYSnow intersects the example's top level in zero keysand objectui#6469's warning fires zero times on it.
props". That phrasecontradicted this guide's own rule two sections earlier — "Every key belongs on
the node itself — never in a
propsenvelope" — and theschema.Xread sites.Since the heading was being rewritten anyway, the claim is not re-authored
into the replacement sentence.
Kept verbatim: "The gantt field config may also be hoisted to top-level
propsinstead of nesting undergantt." That sentence is true — "instead of"does real work, and it describes branch 2 exactly.
Line counts (published-skills ruling, 2026-08-21)
skills/objectui/guides/page-builder.md(whole file).mdunderskills/)skills/objectui/SKILL.mdMeasured with
git show origin/main:PATH | wc -lagainstgit show HEAD:PATH, notestimated from the diff.
The +6 is the second table's scaffolding and nothing else: one blank separator,
two heading lines, one blank, one header row, one separator row. No teaching
paragraph is added; one clause is deleted.
git diff --shortstat: 1 filechanged, 20 insertions, 14 deletions.
Gates
Derived from
package.jsonplus the workflows that carry no path filter, notrecalled. Exit codes captured by redirecting first, so no
tailmasks them.node scripts/check-skills-paths.mjsnode scripts/check-doc-fence-languages.mjs --self-testnode scripts/check-doc-fence-languages.mjsnode scripts/check-control-bytes.mjsnode scripts/check-changeset-presence.mjsnode scripts/check-doc-links.mjsScope notes, so the greens are readable:
--list, which prints a token fromskills/objectui/guides/page-builder.md:29— the file is in its scan set, not merely adjacent to it. This diff adds no new
path token, so the green is a no-regression reading.
skillsis absent from itsSCAN_ROOTS(scripts/check-doc-links.mjs, line 583 onward). Recorded as run,not as coverage.
check-doc-component-types.mjsline 212 states it walkscontent/docs"andnothing else: not
skills/**";check-doc-snippet-types.mjsroots atcontent/docsplus package READMEs.skip-changesetlabel. The gate's own verdict isquoted above. In this repo the
skip-changesetlabel exempts nothing — noworkflow or script reads it — so it is deliberately not applied.
pnpm install, no build, no unit run.This diff touches one
.mdfile and no source; each gate above imports onlynode:builtins, verified by reading their import blocks. eslint does not lintmarkdown here.
Also checked by hand:
grep -naPfor control bytes over the edited file (nomatch), and all 10
jsonfences in the guide re-parsed withjson.loads(10parse, 0 fail).
Drift protection
No code companion is owed. objectui#6469's dev-mode warning plus
ObjectGantt.blockPrecedence.test.tsx("names GanttConfig keys hoisted beside ablock, with no top-level date pair") already pin the runtime behaviour this guide
now describes.
Draft on purpose:
skills/**is a published surface and goes the maintainerreview path.
Generated by Claude Code
Generated by Claude Code