Measured while working #4624 (PR #4630). Filed unassigned. Duplicate-searched (keyword + regenerate-catalog-index.py + the index path): no open issue covers it.
The defect
examples/schema-catalog/package.json declares the documented way to rebuild the catalog index:
"regenerate": "python3 ../../scripts/regenerate-catalog-index.py"
Run it on a clean origin/main @ 69eb6b22b, touching nothing else, and it reports success:
Wrote examples/schema-catalog/src/index.ts with 423 entries.
while producing a 29-insertion / 29-deletion diff that discards hand-curated metadata. The generator derives title from the filename and writes description: "" unconditionally, so entries whose metadata was written by hand are reverted to defaults. Measured examples:
plugin-dashboard/filtered-dashboard-dataset-widgets
- title
"Filtered Dashboard — Dataset + Inline Widgets" becomes "Filtered Dashboard Dataset Widgets"
- description
"Dashboard filters scoping dataset-bound widgets (via the dataset query's runtimeFilter) alongside an inline widget" becomes ""
plugin-dashboard/filtered-dashboard-date-presets
- title
"Filtered Dashboard — Date Presets + Custom Range" becomes "Filtered Dashboard Date Presets"
- description
"Built-in dateRange with presets and allowCustomRange; per-widget date-field override and a dateRange: false opt-out" becomes ""
plugin-dashboard/filtered-dashboard loses its description "Dashboard-level date + region filters driving multiple charts over different objects"
Six plugin-dashboard entries are affected in total, and the entry ordering also changes (filtered-dashboard moves after its own filtered-dashboard-* siblings, because the sort is over the flat filename rather than the path segments).
Why it matters
Anyone adding a catalog entry is expected to run the script — that is what it is for — and doing so silently reverts other people's curated titles and descriptions in the same commit. Those strings are user-visible on /docs/guide/schema-catalog. The loss is easy to miss in review because the diff looks like generated-file churn.
It also means the checked-in index.ts is not reproducible from its generator today: the file and the script disagree, and the script wins whenever it is run.
Fix shape (not prescriptive)
The generator needs to PRESERVE existing title / description for entries already present in index.ts and only synthesize defaults for new ones — or the curated metadata needs to move out of the generated file entirely (a sidecar per entry, or a meta block inside the entry JSON, which the generator would then copy through). The second is the more durable shape, since it removes the class rather than the instance.
Not fixed in PR #4630: that PR changes only entry JSON contents, adds and renames nothing, so it does not need the generator to run, and running it there would have smuggled this loss into an unrelated change.
Generated by Claude Code
Measured while working #4624 (PR #4630). Filed unassigned. Duplicate-searched (keyword +
regenerate-catalog-index.py+ the index path): no open issue covers it.The defect
examples/schema-catalog/package.jsondeclares the documented way to rebuild the catalog index:Run it on a clean
origin/main@69eb6b22b, touching nothing else, and it reports success:while producing a 29-insertion / 29-deletion diff that discards hand-curated metadata. The generator derives
titlefrom the filename and writesdescription: ""unconditionally, so entries whose metadata was written by hand are reverted to defaults. Measured examples:plugin-dashboard/filtered-dashboard-dataset-widgets"Filtered Dashboard — Dataset + Inline Widgets"becomes"Filtered Dashboard Dataset Widgets""Dashboard filters scoping dataset-bound widgets (via the dataset query's runtimeFilter) alongside an inline widget"becomes""plugin-dashboard/filtered-dashboard-date-presets"Filtered Dashboard — Date Presets + Custom Range"becomes"Filtered Dashboard Date Presets""Built-in dateRange with presets and allowCustomRange; per-widget date-field override and a dateRange: false opt-out"becomes""plugin-dashboard/filtered-dashboardloses its description"Dashboard-level date + region filters driving multiple charts over different objects"Six
plugin-dashboardentries are affected in total, and the entry ordering also changes (filtered-dashboardmoves after its ownfiltered-dashboard-*siblings, because the sort is over the flat filename rather than the path segments).Why it matters
Anyone adding a catalog entry is expected to run the script — that is what it is for — and doing so silently reverts other people's curated titles and descriptions in the same commit. Those strings are user-visible on
/docs/guide/schema-catalog. The loss is easy to miss in review because the diff looks like generated-file churn.It also means the checked-in
index.tsis not reproducible from its generator today: the file and the script disagree, and the script wins whenever it is run.Fix shape (not prescriptive)
The generator needs to PRESERVE existing
title/descriptionfor entries already present inindex.tsand only synthesize defaults for new ones — or the curated metadata needs to move out of the generated file entirely (a sidecar per entry, or ametablock inside the entry JSON, which the generator would then copy through). The second is the more durable shape, since it removes the class rather than the instance.Not fixed in PR #4630: that PR changes only entry JSON contents, adds and renames nothing, so it does not need the generator to run, and running it there would have smuggled this loss into an unrelated change.
Generated by Claude Code