Skip to content

docs(plugin-gantt): compile the gantt README's 18 blocks and drop its ledger entry - #8009

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-5174-ungated-docs-batch18
Sep 6, 2026
Merged

docs(plugin-gantt): compile the gantt README's 18 blocks and drop its ledger entry#8009
baozhoutao merged 1 commit into
mainfrom
claude/issue-5174-ungated-docs-batch18

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Part of #5174 — batch 18 of the UNGATED_DOCS burn-down.

packages/plugin-gantt/README.md leaves the ledger and all 18 of its ts/tsx
blocks now compile against the built types. The gate file's only change is the
two lines of that one entry.

⚠️ Concurrency, read this first

Batch 17 (PR #8000, packages/plugin-detail/README.md) is queued and not yet
merged.
Both batches are removals-only inside the UNGATED_DOCS object
literal, on different lines, for different documents, and neither touches the
other's README — the same licence batches 10/11, 12/13, 14/15 and 16/17 ran
under. The merge queue reconciles two line deletions in one literal.

This batch's document lives in packages/plugin-gantt/. #7307's batch 2
will edit packages/plugin-gantt/src/*.test.tsx after PR #7999 lands: different
files, same package. Flagged here because the dispatch asked for it — the
domain:devx seat serialises #7307 batch 2 behind this PR.

Live E2E (informational) is red on every branch today for an upstream reason
(#7990 / objectstack#16186), not because of this diff.

Ledger arithmetic

reading base 15789d5 branch 2c6e3d6
UNGATED_DOCS entries 21 20
covered documents 206 207
…of them holding a ts/tsx block 104 105
covered blocks 661 679
blocks to compile 503 521
declared fragments 158 158 (zero new)
semantic failures 0 0

Programmatic diff of the two UNGATED_DOCS objects (base copy loaded from
git show, both imported as objects, never diffed as text): removed =
['packages/plugin-gantt/README.md'], added = [], reason-changed = [], key
order preserved for survivors = true, survivors = 20. git diff --numstat on
the gate file is exactly 0 2.

The strictness region — the Fence scanning banner line to EOF, 1178 lines on
both sides — hashes to f46b5662ba336f026bca3a0003e0b7979789d48d0291fa5760be7d23c8ed0160
on base and on branch, the value batches 15 to 17 recorded. Nothing in the
gate's judging logic moved.

Census and the rung that decided

Re-taken on THIS base through the gate's exported analyze() /
compileSnippets() over all 17 non-excluded ledger candidates. Rung 1 (larger
measured debt: blocks) decided outright — no tie-break was needed.

document blocks diagnostics distinct codes
packages/plugin-gantt/README.md 18 26 6
packages/collaboration/README.md 7 18 7
packages/permissions/README.md 7 18 4
packages/types/README.md 7 6 3
packages/layout/README.md 7 2 1
packages/react-runtime/README.md 5 27 6
packages/plugin-list/README.md 5 8 3
packages/core/README.md 5 6 2
packages/plugin-kanban/README.md 5 6 2
plugin-ai 4/8 · providers 4/8 · plugin-charts 4/6 · plugin-editor 4/6 · plugin-map 4/2 · plugin-markdown 4/2
fields 2/3 · plugin-tree 1/3

The dispatch's assumption A1 (collaboration and permissions tied at the top) is
falsified on this base, and the reason is the licence the claim itself
granted
: PR #7985 merged at 07:20Z and put the gantt and kanban READMEs back
in the pool. Verified on this base rather than inherited — 6bfe358 (the #7985
merge commit) is an ancestor of 15789d5, git merge-base --is-ancestor exit
0. At 18 blocks the gantt README is the largest remaining entry by a factor of
two and the rungs never reach a tie.

Exclusions re-verified against GitHub on this base, not inherited: README.md
is not a packages/NAME/README.md; packages/auth/README.md is held by draft
PR #7685 (open); packages/plugin-detail/README.md is batch 17's PR #8000
(open, queued); packages/plugin-chatbot/README.md is deferred. No open PR
touches packages/plugin-gantt/README.md — all 11 open PRs' file lists were
read over REST, including #7685's 67 paths and #5400's 1048.

What the 26 diagnostics were, and what each repair did

13 parse + 13 semantic. Two of the semantic ones were real drift, not fragment
shape; the rest were undefined names and implicit any.

block was now
onTaskUpdate opt-in (fence 78) bare JSX, GanttView / tasks / save undefined, task and the destructured { start, end } implicitly any real self-import, declare const placeholders typed to the shipped surface, JSX bound to a name (no re-indentation); the callback's params now type from GanttViewProps
getDataConfig node (fence 214) a bare object literal fenced typescript, so it was not a statement at all bound to const recordSource
getGanttConfig node (fence 241) same bound to const fieldMapping
GanttTask excerpt (fence 393) referenced GanttDependency and GanttTaskType without importing them one import type line; the readme-exports partial marker and every member are untouched
Interactive gantt (fence 487) doc lie: type: 'gantt' inside the ObjectGantt element's schema prop does not type-check — ObjectGanttProps.schema is ObjectGanttSchema, whose type is the literal 'object-gantt'; plus dataSource undefined the type spelled 'object-gantt', the way this README's OTHER direct-render example already spells it, plus a DataSource placeholder. The registration table is untouched: it describes the registry, which really does claim both keys. The gap between the two is filed as #8008, not decided here
Custom markers (fence 635) bare JSX, GanttView / tasks undefined import + placeholder + bound to a name
Data-source integration (fence 712) real drift: const schema = { … } widened type to string, so it was not assignable where it was passed annotated const schema: ObjectGanttSchema, so every key in it is now checked against the shipped type

No packages/** source touched, no public type widened, no gate loosened, and
no new FRAGMENT_MARKER — declared fragments stay at 158, so all 18 blocks
earn their coverage by compiling.

Probes — six, predicted in writing before each ran

Every mutation proven on disk (occurrence counts of the injected AND the deleted
text, plus git hash-object against the HEAD blob), every restore
git checkout HEAD -- ABSOLUTE_PATH proven by an empty git diff HEAD, every
leg under a trap … EXIT INT TERM with absolute paths. No rebuild is owed on
any leg, and that was reasoned rather than assumed: the gate reads the mutated
bytes straight from the working tree and no probe touches dist/.

probe prediction observed
P1 — restore the ledger entry, keep the repaired README exit 0, coverage silently falls back exit 0; 206 covered … 21 ungated, 661 — 503 to compile, 503 of 503 judged, 0 failed. The entry is what suppressed the verification
P2 — plant titleField: 42 at line 744, inside a block this diff repaired exit 1, exactly one TS2322 there exit 1, 521 of 521 judged, 1 failed, README.md:744:3 TS2322: Type 'number' is not assignable to type 'string'
P3 — base README bytes, ledger removal kept exit 1, the original 26 diagnostics at the pre-repair sites exit 1, all 26, every code and site as predicted (2 parse-failed + 5 semantic-failed blocks). The coverage figures in the written prediction were wrong — see the report's deviations
P4 — the live pin readme-navigation-example.test.ts: add basePath back into the navigation fence control green first, then 3 assertions red control 5 passed; mutated 3 failed / 2 passed — the accept assertion, the declared-members assertion and the section-wide one
P5 — retype a placeholder this diff added (tasks: GanttTask[] to number[]) exit 1, one diagnostic; the second GanttView block has its own declaration and stays green exit 1, 1 failed, README.md:87:3 TS2322: Type 'number[]' is not assignable to type 'GanttTask[]' — exactly one
P6 — fabricate the self-import name GanttViewNope check:readme-exports red with 1 fabricated; control green control 448 real, 0 fabricated; mutated exit 1, 447 real, 0 wrong-path, 1 fabricated, naming line 79

Gates — all at 2c6e3d6, clean tree, nothing pushed after

Exit codes captured by redirect-then-capture, never through a pipe; each row
quotes the gate's own verdict line.

gate verdict
pnpm check:doc-snippets 0 — Scanned 227 document(s): 207 covered (105 of them hold a ts/tsx block), 20 ungated · 521 of 521 block(s) judged, 0 failed · Every covered documentation snippet compiles against the built types.
pnpm check:doc-fences 0 — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript
pnpm check:readme-exports 0 — 448 of them self-imports judged (448 real, 0 wrong-path, 0 fabricated)
pnpm check:doc-types 0 — Every documented component type is registered.
node scripts/check-doc-links.mjs 0 — Links are valid across 17 scan roots.
pnpm check:doc-example-readers 0 — OK 80 documented symbol(s), 3947 call site(s)
pnpm check:control-bytes 0 — OK (scanned 6439 tracked text file(s); skipped 85 binary); plus a manual C0/DEL scan of both changed paths, no hit
node scripts/check-node-esm-load.mjs 0 — Provenance leg: 37 of 37 gradable entries were built by this tree.
pnpm type-check:scripts 0
node scripts/check-changeset-presence.mjs 0 — no changeset is owed
check-governed-queue-guard.mjs --test (both paths) 0 — NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched

The build came first and was forced: turbo run build --filter=./packages/* --concurrency=2 --force, 39 successful, 0 cached, 2m55s. --force because
turbo shares one cache across every worktree of a checkout and
check-node-esm-load's provenance leg refuses artifacts this tree did not
produce — batch 17 measured exactly that failure.

Tests: pnpm exec vitest run over every test file that reads either changed
path, derived with git grep -l and not guessed — 16 files, 597 passed,
including scripts/__tests__/doc-version-claims.test.ts (a docs-only diff skips
CI's test shards by design, so a version literal on a doc surface would
otherwise red only in the merge queue). Owning package
pnpm exec vitest run packages/plugin-gantt/Test Files 63 passed / Tests 496 passed; pnpm --filter @object-ui/plugin-gantt type-check exit 0, its
output echoing tsc --noEmit && tsc -p tsconfig.test.json.

Readers of the changed README: the gate itself (proven by P1), check:doc-fences
and check-readme-exports (proven live by P6), and one live TEST pin —
packages/plugin-gantt/src/readme-navigation-example.test.ts, which extracts the
navigation fence and parses it with the spec's NavigationConfigSchema (proven
live by P4, non-vacuous by its own control leg).

Out of scope, filed rather than fixed: #8008 — the registered gantt node
spelling has no declared schema type, which is why the direct-render example
moved to object-gantt instead of being annotated in place.

This PR is a DRAFT and stays a draft: this seat does not flip ready, does not
enable auto-merge, and touches no labels or assignee.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ


Generated by Claude Code

… ledger entry

All 18 ts/tsx blocks in `packages/plugin-gantt/README.md` now compile against
the built types, so the document leaves `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` — a two-line removal inside the object
literal, the only change to the gate file.

The 26 measured diagnostics were 13 parse (two bare object literals fenced
`typescript`, so neither was a statement), 11 fragment-shape undefined names
across four blocks, and two real drifts:

- `<ObjectGantt schema={{ type: 'gantt', … }} />` did not type-check:
  `ObjectGanttProps.schema` is `ObjectGanttSchema`, whose `type` is the
  literal `'object-gantt'`. The direct-React example now spells the type the
  way this README's other direct-render example already does. The registry
  still claims both keys; that table is unchanged.
- The data-source example's `const schema = { … }` widened `type` to `string`
  and so was not assignable to `ObjectGanttSchema` where it was passed. It is
  now annotated with the shipped type, which checks every key in it.

The `GanttTask` excerpt keeps its `readme-exports` partial marker and gains the
two type imports it always referenced. No `packages/**` source, no widened
type, no loosened gate, and no new fragment marker: declared fragments stay at
158, so all 18 blocks earn coverage by compiling.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin labels Sep 6, 2026
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3186.0 KB 3191.4 KB
Main entry chunk (gzip) 143.5 KB 350 KB
Entry file index-BO0uFEv5.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 497.06KB 113.79KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.08KB 50.62KB
fields (index.js) 242.44KB 61.25KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 47.35KB 13.21KB
plugin-charts (index.js) 70.31KB 19.62KB
plugin-chatbot (index.js) 193.53KB 46.05KB
plugin-dashboard (index.js) 131.41KB 34.43KB
plugin-designer (index.js) 211.51KB 43.01KB
plugin-detail (index.js) 247.59KB 63.48KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.56KB 56.63KB
plugin-kanban (index.js) 52.30KB 14.49KB
plugin-list (index.js) 113.24KB 27.66KB
plugin-map (index.js) 20.35KB 6.77KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 29.95KB 8.67KB
plugin-tree (index.js) 9.16KB 3.18KB
plugin-view (index.js) 84.33KB 20.75KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Contributor

Standing down on Live E2E (informational) — red on the base branch too, not this PR's. domain:devx @ objectui execution seat, PM session session_01MM7kaS4dPpYHV5BsMyu4tQ, R45, 2026-09-06T08:41Z. Same signature as main's scheduled run 34017174769 (job 101442890465): the published backend boots without its auth core (objectstack#16186); consumer-side anchor #7990. This diff is one README and two ledger lines — no backend pin, no e2e/ path. No fix to port, no re-run spent. Flip and arming wait on the remaining shards (ACCEPT 5558089371 on #5174).


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 6, 2026 09:20
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 6, 2026
Merged via the queue into main with commit 437bf20 Sep 6, 2026
31 of 32 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-5174-ungated-docs-batch18 branch September 6, 2026 09:37
baozhoutao pushed a commit that referenced this pull request Sep 6, 2026
Batch 18 (PR #8009) and objectui#7307 batch 2 (PR #8013) landed while this batch
was measuring. Both gate-file changes are removals inside UNGATED_DOCS on
different lines, for different documents.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation plugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants