Skip to content

packages/components/README.md is one declared fragment away from leaving UNGATED_DOCS — the trade is one extra package in the gate's build filter #5259

Description

@os-support-ai

Observation recorded while implementing #5160, deliberately not acted on there. Filing it so the trade is decided rather than taken silently.

The state after #5160

packages/components/README.md went from 5 diagnostics to 1:

packages/components/README.md:183:4 TS2304: Cannot find name 'Outlet'.

Its UNGATED_DOCS entry is now just 1 undefined-name diagnostic(s) — ….

That one block is a router-layout excerpt showing where the notification surfaces mount:

import{NotificationBanners,NotificationAlerts}from'@object-ui/components';<main><NotificationBanners/><Outlet/><NotificationAlerts/></main>

Outlet is react-router's, supplied by the host. That is precisely the case scripts/check-doc-snippet-types.mjs names in its own header as a legitimate declared fragment — "a call into the host's own router". Marking it with the documented marker

<!-- doc-snippet: fragment — the host supplies react-router's Outlet -->

would take the document to zero, let its UNGATED_DOCS entry be deleted, and put every other ts/tsx block in this published README under the gate permanently. The ratchet would actually move, which no other document in the #5160 set can currently do.

Why #5160 did not just do it

Covering the document grows the gate's build filter. node scripts/check-doc-snippet-types.mjs --build-filter derives its turbo filters from what the covered documents import, and this README imports @object-ui/components — which is not in the filter today and is not reachable from anything that is (@object-ui/react does not depend on it; the dependency runs the other way). So covering it adds @object-ui/components plus @object-ui/i18n, @object-ui/react-runtime, @object-ui/sdui-parser to every gate run.

Measured on main + #5160, the filter is unchanged at 11 packages:

--filter=@object-ui/cli --filter=@object-ui/core --filter=@object-ui/data-objectstack
--filter=@object-ui/plugin-charts --filter=@object-ui/plugin-editor --filter=@object-ui/plugin-grid
--filter=@object-ui/plugin-markdown --filter=@object-ui/plugin-timeline --filter=@object-ui/plugin-view
--filter=@object-ui/react --filter=@object-ui/types

Per-PR build cost is exactly what the 2026-08-16 ruling on #4846 constrained, and the gate's own header calls the scoped build the reason --build-filter exists. Growing it is a cost decision, not a mechanical edit — so it was left to a maintainer instead of being taken as a rider on a documentation card.

The decision

  • A. Declare the fragment, delete the ledger entry, accept @object-ui/components in the filter. One published README moves from unverified to gated.
  • B. Leave it ungated. Zero CI cost; the README's other blocks stay unverified, and nothing stops the next registerDefaultRenderers-shaped fabrication landing in it.

The same question will recur for every other near-zero document, so a stated rule ("cover it when it reaches zero, cost accepted" vs "cover it only when the package is already in the filter") is worth more than this one answer.

Related

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions