Skip to content

docs(providers): compile every README snippet against the shipped surface - #8206

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-5174-doc-snippets-batch29-providers
Sep 7, 2026
Merged

docs(providers): compile every README snippet against the shipped surface#8206
baozhoutao merged 2 commits into
mainfrom
claude/issue-5174-doc-snippets-batch29-providers

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #5174 (batch 29: packages/providers/README.md)

packages/providers/README.md leaves the UNGATED_DOCS ledger in scripts/check-doc-snippet-types.mjs and joins the compiled tier of check:doc-snippets. The page reads zero after repair, so its entry is deleted rather than rewritten.

  • Base: 158d75bb322e4697e28a6ae3d870cc3555f7d237 (carries PR docs(auth): compile every README snippet against the shipped surface #8189, batch 28).
  • origin/main advanced to d80447d4e mid-task (three unrelated PRs; git diff --name-only over that range against both of my paths is empty). Merged in with a merge commit, never a rebase, per the brief. Every reading below is pinned to the merged head 678609876.
  • Files changed: packages/providers/README.md, scripts/check-doc-snippet-types.mjs (the ledger row only). No changeset owed. Nothing under packages/providers/src/** or packages/types/src/** touched.

Note on spelling: JSX tag-shaped and generic-shaped fragments are written as prose names below, because GitHub's body sanitizer silently eats them — see AGENTS.md.

Census — two readings, with the gate's own analyzer

Both readings drive the gate's exported analyze / compileSnippets (no hand-written regex), with the page forced into the compiled tier and every other ledger row left ungated. Harness controls healthy on both runs: resolution landed on packages/types/dist/index.d.ts, sentinel 1 diagnostic, positive 0, undeclared 1, zero package-src leaks, zero analyzer findings.

Reading 1 — ledger-literal, on the base

Total 8: TS2304 x7, TS2741 x1. Matches the ledger row's own wording exactly.

fence (base line) count diagnostics
19 DataSourceProvider 2 TS2304 myCustomDataSource; TS2304 App
31 MetadataProvider 2 TS2304 myMetadata; TS2304 App
43 ThemeProvider 1 TS2304 App
53 Usage Example 3 TS2304 myDataSource; TS2304 myMetadata; TS2741 children

Assumption A1 is falsified in one place, and this is the exact split it asked for. The brief expected App four times, one per fence — which would be eight mentions carried by seven diagnostics, and it flagged that arithmetic itself. The resolution is neither of the two the brief offered: App is an ambient name in three fences only, because the Usage Example declares function App() itself, so that name is bound inside its own block. Split: App x3, myMetadata x2, myCustomDataSource x1, myDataSource x1 = 7. Nothing is counted once that appears twice, and no fence compiles App differently.

Reading 2 — after adding only the missing declare stand-ins, in memory

Prefixed to each fence body: type-only imports plus declare const lines, nothing else. Every fence already carried its own value import, so no value import line was added and no prop was touched.

Total 1: TS2741 x1, fence 53. Fences 19, 31 and 43 read zero.

Blind-spot count: 0. Batches 27 and 28 both found a mixed ledger row understating type debt, and the mechanism is specific: an unresolved JSX tag name short-circuits the prop check on its own element. That mechanism cannot fire here — every provider tag name is imported and bound in every fence, and all seven undefined names sit in ordinary value positions (dataSource={…}, metadata={…}, and an App element that takes no props). So this row was exact in the type-code direction. The other direction from batch 28 does hold, strongly: 7 of the 8 diagnostics were ambient names, 1 was a real defect.

The ledger-or-repair decision is made on reading 2, per the batch-28 carry-forward.

Reading 3 — the page as committed

Total 0 across all four fences, measured through the same harness. pnpm check:doc-snippets agrees: 601 of 601 blocks judged, 0 failed.

Per-fence decision

All four fences: repair. Nothing ledgered, nothing declared a fragment.

fence decision what changed
DataSourceProvider repair myCustomDataSource and App become declare const stand-ins
MetadataProvider repair myMetadata and App become stand-ins
ThemeProvider repair App becomes a stand-in
Usage Example repair myDataSource / myMetadata stand-ins, and the MetadataProvider element is given a real child

The first three fences are bare JSX expression statements. That shape is kept, and the gate's parse phase never objected to it — before and after, its syntax line reads "every block parsed, so every one of them reached the semantic phase". No fragment marker, no @ts-expect-error, no widened type, no loosened prop anywhere in the diff.

Stand-in types, all read off the shipped surface: DataSourceProviderProps['dataSource'], MetadataProviderProps['metadata'], and () => ReactNode for the component stand-ins.

The TS2741, decided against the exported props type

Declarations cited from packages/providers/src/types.ts (byte-identical in the built packages/providers/dist/types.d.ts):

  • :4 DataSourceProviderProps:5 dataSource: any, :6 children: ReactNode required
  • :9 MetadataProviderProps:10 metadata?: any, :11 children: ReactNode required
  • :43 ThemeProviderProps:44 defaultTheme?: ThemePreference, :45 storageKey?: string, :46 children: ReactNode required

Assumption A2 confirmed. The diagnostic is on the Usage Example's MetadataProvider, exactly where the brief predicted:

Property 'children' is missing in type '{ metadata: any; }' but required in type 'MetadataProviderProps'.

Verdict: README defect, repaired to the shipped surface. This is batch 28's shape again — the type refuses nothing the page passes; it requires something the page omits. So it takes the first branch of the brief's rule, not the type-defect branch, and the ledger keeps no count.

What the page used to teach: that a placeholder comment satisfies a required children prop. The element's entire content was a JSX expression container holding a comment and nothing else, which is no child at all — a reader copying the one example the page presents as the complete wiring gets a red build on it. It now nests an AppContent stand-in, and the prose above the fence states that both providers declare children required, so the next author does not re-introduce the placeholder.

The other two providers in that same fence were never at issue: ThemeProvider and DataSourceProvider each already had a real element inside them.

The any bound, recorded rather than invented

dataSource and metadata are declared any (types.ts:5 and :10). No stronger type was invented for either: each stand-in is typed through the prop it is passed to, so it inherits any, and the fence comment says out loud that the compiler therefore checks nothing about those objects' shape. That laundering is a known, declared one — objectui#8160 and objectui#7912 already name it — so it is cited here and not re-filed.

Key surface (objectui#7927)

Verified rather than assumed: none of DataSourceProviderProps, MetadataProviderProps or ThemeProviderProps extends anything, none is BaseSchema-derived, and none carries an index signature — a grep of packages/providers/src/types.ts for extends, BaseSchema and index-signature syntax returns no hits. So the compiler judges the keys itself through JSX excess-property checking, and the per-key table collapses to its verdict per fence:

  • DataSourceProvider fence — one key, dataSource; compiler judges; zero.
  • MetadataProvider fence — one key, metadata; compiler judges; zero.
  • ThemeProvider fence — defaultTheme and storageKey, both declared and both optional; "system" is a member of ThemePreference; zero.
  • Usage Example — dataSource, metadata, and children on all three elements; zero after the repair.

Strictness region

The region from the Fence scanning banner to EOF, byte-identical as the licence requires:

tree sha256 bytes
base 158d75bb3 2749d53ae3a8df033a53b8d7a354fa7e22ee2d1a17f6ad0c3d61122e904e084b 83711
head 678609876 2749d53ae3a8df033a53b8d7a354fa7e22ee2d1a17f6ad0c3d61122e904e084b 83711

Identical. The gate diff is exactly the two lines of this page's UNGATED_DOCS row, deletions only (2 --, no additions).

Ledger

The page reads zero, so its entry is deleted, per the ledger contract. Rows 9 to 8. No pin enumerates it — scripts/__tests__/check-doc-snippet-types.test.ts pins only the root README.md row at :600/:601 — so no test file needed editing.

Counters on the head: 229 documents; covered 220 to 221 (118 of them hold a ts/tsx block); ungated 9 to 8; blocks to compile 597 to 601, exactly this page's four fences; declared fragments 158 to 158, unchanged.

Positive control

Injected defaultTheme={42} into the repaired ThemeProvider fence (ThemePreference is a string union), against the committed tree, inside a trap whose restore path is absolute.

  • clean before: git diff HEAD on the path 0 bytes; disk blob equals the HEAD blob 3e986a6de1e0a19f75fadefeaa5e1611ba983c81
  • injection landed on disk, proven by anchor counts (anchor 1 to 0, injected 0 to 1) plus the blob moving to 67d0e621beebeb119777193a84c548b38ae3d933 — not by an editor's exit code
  • gate exit under injection: 1, naming the file and the line:
    [semantic] packages/providers/README.md:70:16 TS2322: Type 'number' is not assignable to type 'ThemePreference | undefined'.
    and its semantic line reads 601 of 601 block(s) judged, 1 failed
  • restore proven by STATE, not by exit code: disk blob back to 3e986a6de1e0a19f75fadefeaa5e1611ba983c81, git diff HEAD on the path 0 bytes, git status --porcelain empty

Run twice with identical results — once on the pre-merge commit 5bf697c60, once on the merged head.

Gates, every reading pinned to 678609876

Exit codes captured by redirect-then-capture, never across a pipe.

gate exit
pnpm check:doc-snippets 0
pnpm exec vitest run scripts/__tests__/check-doc-snippet-types.test.ts scripts/__tests__/check-doc-fence-languages.test.ts 0 (123 tests)
pnpm exec vitest run scripts/__tests__/ 0 (115 files, 3415 tests)
pnpm check:doc-types 0
pnpm check:readme-exports 0 (package built)
pnpm check:doc-fences 0
pnpm type-check:scripts 0
pnpm lint:root 0
pnpm check:control-bytes 0
grep -naP control-byte self-scan, both changed paths 1 (no match, clean)
node scripts/check-changeset-presence.mjs 0 — no changeset owed
node scripts/check-governed-queue-guard.mjs --test both paths 0 — NOT GOVERNED
pnpm check:entry-guard 0
turbo build closure (--build-filter, --concurrency=2) 0 (35/35)

Re-derived beyond the brief's list against the actual diff, all 0: check:doc-example-readers, check:esm-specifiers, check:shell-escape-residue, lint:coverage, type-check:coverage, check:self-import, check:unreferenced-sources, check-doc-links.mjs, check-doc-component-types.mjs, check-doc-expression-carriage.mjs, and check:node-esm-load.

check:node-esm-load first exited 1 for the environmental reason the brief predicted: turbo shares one cache across every worktree of a checkout, so one package replayed an artefact built in a sibling worktree and the gate correctly refused to grade another tree's output. Re-run with --force-build, as its own message instructs, it exits 0 with 34 of 39 published ESM entries imported and evaluated.

Live E2E (informational) is red on every branch today for an upstream reason (#7990, objectstack#16186) and is not this branch's.

This PR is draft, base main, and the work was published from Claude Code session session_01FhBNJcLRZLe8M87VcUgpKr.


Generated by Claude Code

…face

`packages/providers/README.md` leaves the `UNGATED_DOCS` ledger in
`scripts/check-doc-snippet-types.mjs` and joins the compiled tier of
`check:doc-snippets` (objectui#5174, batch 29).

The ledger row read `7 undefined-name diagnostic(s) … plus TS2741x1`. Measured
with the gate's own analyzer, the seven undefined names were ambient values the
page never defined (`myCustomDataSource`; `App` in the three provider fences;
`myMetadata` twice; `myDataSource`) — the Usage Example defines its own `App`,
so that name is a stand-in three times, not four. After adding only `declare`
stand-ins, one diagnostic remained: `TS2741` — `children` missing on the
`MetadataProvider` of the Usage Example, whose only child was a placeholder
comment. `MetadataProviderProps` declares `children: ReactNode` required, so
the page was teaching a comment as a value; it now nests a real element.

Each stand-in is typed from the prop it is passed to
(`DataSourceProviderProps['dataSource']`, `MetadataProviderProps['metadata']`,
`() => ReactNode`). Both data bounds are declared `any` today, and the fences
say so rather than inventing a stronger type — the laundering objectui#8160 and
objectui#7912 already track. No type widened, no fragment marker added, no
`@ts-expect-error`, and nothing under `packages/providers/src/**` touched.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
…29-providers

No overlap with this branch's two paths; merged so every reading below is
pinned to a head that contains what landed on main mid-task.

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

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3189.7 KB 3191.4 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-hEe9Dmno.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) 498.00KB 113.91KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 187.85KB 52.13KB
fields (index.js) 243.04KB 61.36KB
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) 6.57KB 2.76KB
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.67KB 13.25KB
plugin-charts (index.js) 70.62KB 19.71KB
plugin-chatbot (index.js) 193.54KB 46.04KB
plugin-dashboard (index.js) 131.41KB 34.43KB
plugin-designer (index.js) 211.51KB 43.01KB
plugin-detail (index.js) 247.68KB 63.49KB
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.58KB 56.63KB
plugin-kanban (index.js) 52.83KB 14.63KB
plugin-list (index.js) 113.35KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
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) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
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) 13.64KB 4.59KB
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 Author

Standing down on Live E2E (informational) for this PR — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-07T00:59Z.

That check is informational (not in the main ruleset's required contexts) and is red on the base branch for an upstream reason anchored on objectui#7990 / objectstack#16186; this PR touches one package README and one ledger row in a gate script, neither of which the Live E2E suite exercises. No re-run is requested. Every required check is judged on its own conclusion; this PR flips to ready only when all of them read completed / success on 678609876.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 7, 2026 01:06
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Armed — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

  • CI on 678609876 converged all green at 01:05:51Z (29 checks; Live E2E (informational) excluded per the standing-down note above).
  • Ready for review at 01:06:00Z; post-flip Governed Surface Queue Guard completed/success at 01:06:17Z.
  • Auto-merge SQUASH enabled; added_to_merge_queue on the REST timeline at 01:06:25Z (read 01:06:30Z).

Landing stroke follows the merge: content probe on re-fetched origin/main (declare const AppContent in packages/providers/README.md and the ledger row's absence, with a control), LANDED here and on objectui#5174 (which stays open, Part of), then the batch-30 claim (packages/plugin-chatbot/README.md).


Generated by Claude Code

Merged via the queue into main with commit 5901581 Sep 7, 2026
31 of 32 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-5174-doc-snippets-batch29-providers branch September 7, 2026 01:22

Copy link
Copy Markdown
Contributor Author

LANDED — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

Merged at 2026-09-07T01:22:09Z as 590158122 (squash). Content probe on re-fetched origin/main at 01:22Z: declare const AppContent at packages/providers/README.md:94; the 'packages/providers/README.md' row is absent from UNGATED_DOCS (0 hits) while the control row 'packages/plugin-chatbot/README.md' is present (1 hit); the ledger reads 8 rows; the strictness region still hashes to 2749d53ae3a8df033a53b8d7a354fa7e22ee2d1a17f6ad0c3d61122e904e084b.

Batch 30 (packages/plugin-chatbot/README.md) is claimed on objectui#5174 next; the card stays open (Part of).


Generated by Claude Code

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 package: providers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants