Skip to content

docs(plugin-ai): compile the README's snippets against the shipped surface, retire its UNGATED_DOCS row - #8180

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-5174-doc-snippets-batch27-plugin-ai
Sep 6, 2026
Merged

docs(plugin-ai): compile the README's snippets against the shipped surface, retire its UNGATED_DOCS row#8180
baozhoutao merged 2 commits into
mainfrom
claude/issue-5174-doc-snippets-batch27-plugin-ai

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Part of #5174 (batch 27: packages/plugin-ai/README.md)

Burns down the packages/plugin-ai/README.md row in scripts/check-doc-snippet-types.mjs's UNGATED_DOCS ledger. The page's four tsx fences now compile against the built types, so the row is deleted rather than rewritten.

Base: origin/main 9bfd61848 (carries PR #8158, which re-baselined this gate's strictness region). origin/main moved to 967e5d803 mid-task and was merged in — never rebased — so every reading below is pinned to the merged head 61759cfcc.

Takeover

The first dev of this batch died at ~22:14Z (container restart) leaving one local, unpushed commit 80210b0d4 on a clean tree, no PR and no report. This PR inherits that commit rather than restarting; it was treated as an unreviewed patch and re-verified against every ruling before anything was added to it.

What 80210b0d4 held: packages/plugin-ai/README.md +103/−50 and scripts/check-doc-snippet-types.mjs −2.

What was re-verified, independently: the census on both sides was re-taken with the gate's own exported analyzer (scanFences / analyze / compileSnippets, never a hand-written regex); the per-key table below was re-derived from the schema declarations and the components' destructures; the strictness region was re-hashed on both sides; the ledger diff was confirmed to be the two entry lines and nothing else; and the positive control — the step the first dev died inside — was redone from scratch on a tree proven clean first (git status --porcelain empty, git diff HEAD zero bytes, so no half-applied injection survived the restart).

What changed on top: one merge commit for origin/main 967e5d803. No fix-up commit was needed — 80210b0d4 violated no ruling. Nothing was amended and nothing was force-pushed.

Census, before and after

Measured with the gate's own analyzer, with this page forced into the compiled tier and every other ledger row left ungated, so exactly one page is under measurement.

Before — base 9bfd61848, 8 diagnostics. Reproduces the ledger row (5 undefined-name … plus TS2322x3) exactly:

Fence Diagnostics
25 tsx 4 — TS2322×3 (all three components' props), TS2552 Cannot find name 'recommendationsData'
69 tsx 1 — TS2304 Cannot find name 'AIFormAssist'
84 tsx 2 — TS2304 Cannot find name 'AIRecommendations', TS2304 Cannot find name 'data'
99 tsx 1 — TS2304 Cannot find name 'NLQueryInput'

By code: TS2322×3, TS2304×4, TS2552×1.

After — head 61759cfcc, 0 diagnostics. Fences moved to lines 29, 87, 114, 140; all four CLEAN. Four tsx fences before and after, zero fragment markers on either side.

The blind spot: the ledger's TS2322x3 was the visible half of six

The ledger counted 3 prop mismatches. There were 6. An unresolved JSX tag name short-circuits the prop check on that same element, so fences 69, 84 and 99 — bare JSX with no import line — hid one TS2322 each behind their TS2304. Measured by giving those fences, in memory only, the import line the page never wrote and an any stand-in for the two ambient names, touching nothing about the props: the count goes 3 → 6, one per fence, and no other code appears.

This is a property of TypeScript's diagnostic suppression, not a gate defect, but it means any ledger row that mixes undefined-name diagnostics with type codes is a lower bound on that page's real debt. Worth knowing for the remaining rows. The page pays down all 11 real diagnostics (5 undefined-name + 6 prop mismatches).

What the repair was, and why the README moved rather than the components

All three exported components take exactly one schema prop plus callbacks — AIFormAssistProps, AIRecommendationsProps, NLQueryInputProps in packages/plugin-ai/src/*.tsx. Every README example passed flat props (formId=, objectName=, fields=, maxResults=, layout=, …). So the page taught an API the components do not have, against components that are right: the README is what moves. One typed binding per example from the schema type @object-ui/types exports, passed as schema={…}, with declare const stand-ins for the two ambient names the page never defined (typed as AIRecommendationItem[], not any).

No @ts-expect-error, no fragment marker, no widened or loosened type, no edit to packages/plugin-ai/src/** or packages/types/src/**, no gate strictness change.

The registry type discriminators were read from the ComponentRegistry.register calls in packages/plugin-ai/src/index.tsx, not from the README — and one of them is not the component name: NLQueryInput registers as nl-query. The page now says so in a table, because that was undocumented and is exactly the kind of thing a metadata author guesses wrong.

The Schema-Driven Usage heading was promoted from ### to ##: it documents registry usage, not a component, so it did not belong inside the Components section.

Per-key table (ruling 3 — the key-surface bound)

BaseSchema carries [key: string]: any at packages/types/src/base.ts:398, so a BaseSchema-derived annotation checks member types and never member keys (objectui#7927). Every key each example writes was therefore classified by hand against the schema type's own declaration — the compiler cannot do it.

Result: all 14 keys the examples write are declared. Nothing was dropped, and no key is "undeclared but read at runtime".

Key (example) Declared Read at runtime Verdict
type (all 3) ai.ts:92 / :204 / :316 discriminant keep
formId ai.ts:97 no keep (declared) — inert, see below
objectName (all 3) ai.ts:102 / :209 / :321 no keep (declared) — inert
fields ai.ts:107 no keep (declared) — inert
autoFill ai.ts:127 dead destructure, AIFormAssist.tsx:31 keep (declared) — inert
showConfidence ai.ts:132 AIFormAssist.tsx:29 keep
showReasoning ai.ts:137 AIFormAssist.tsx:30 keep
recommendations ai.ts:224 AIRecommendations.tsx:28 keep
maxResults ai.ts:229 no keep (declared) — inert
showScores ai.ts:234 AIRecommendations.tsx:29 keep
layout ai.ts:239 AIRecommendations.tsx:30 keep
emptyMessage ai.ts:259 AIRecommendations.tsx:32 keep
placeholder ai.ts:326 NLQueryInput.tsx:26 keep
suggestions (NLQuery) ai.ts:341 NLQueryInput.tsx:28 keep
showHistory ai.ts:346 NLQueryInput.tsx:29 keep

Finding proposal, filed as #8178, not fixed here. Seven of those declared members are read by nothing: formId, objectName (all three schemas), fields, maxResults, and autoFill (destructured at AIFormAssist.tsx:31 and never referenced again). maxResults is the sharp one — its doc comment says Maximum number of results to display and AIRecommendations renders every item with no slice anywhere. grep -rn maxResults packages/*/src returns exactly two hits, the declaration and the designer input metadata, and zero reads. Five of the seven are also advertised as authorable inputs by ComponentRegistry.register in packages/plugin-ai/src/index.tsx, so the designer offers keys the renderer ignores. That is the same class objectui#7742 already carries for KanbanSchema; enforce-or-remove is a maintainer call and #8178 does not pick one. It is out of scope for this PR under the ruling that declared keys are kept — the examples keep them, and the snippets compile, because the gate can see types and not inertness.

Ledger decision

The page reads zero, so its row is deleted, not rewritten. The gate diff is exactly the two lines of that row (git show 80210b0d4 -- scripts/check-doc-snippet-types.mjs: -2, no additions). Package ledger rows: 11 → 10. Gate counters on the head: 229 documents scanned, 219 covered, 10 ungated; compiled blocks 583 → 587 (this page's four fences joined the compiled tier); declared fragments 158 → 158 — no marker was added to buy a pass.

The json fence (now line 167) writes type, formId, objectName, fields, showConfidence — all declared, and no key was dropped under ruling 3, so it is left alone. It is read by check:doc-types, which is green.

Strictness region

The region from the Fence scanning banner to EOF, sha256, re-baselined from PR #8158:

Tree sha256 bytes
base 9bfd61848 2749d53ae3a8df033a53b8d7a354fa7e22ee2d1a17f6ad0c3d61122e904e084b 83711
head 61759cfcc 2749d53ae3a8df033a53b8d7a354fa7e22ee2d1a17f6ad0c3d61122e904e084b 83711

Byte-identical. The deleted ledger row sits above the banner.

Positive control

Redone from scratch against the committed tree, under a trap … EXIT INT TERM with absolute paths.

  1. Tree proven clean first: git status --porcelain empty, git diff HEAD 0 bytes, README on disk 680ca1be68f88d4f658be017f244beca503c3978 = its HEAD blob.
  2. Injected showConfidence: 42 (was true) into the Quick Start fence. Landed on disk, proven by anchor counts (1 occurrence of the injected text, one fewer of the anchor) and by the blob hash moving to 4a3cd757a606cdff5fa987bc8506607244951179 — not by the editor's exit code.
  3. pnpm check:doc-snippetsexit 1, naming the page and the line:
    [semantic] packages/plugin-ai/README.md:45:3 TS2322: Type 'number' is not assignable to type 'boolean | undefined'.
  4. Restore proven by state, not by exit code: git diff HEAD -- packages/plugin-ai/README.md 0 bytes, on-disk hash back to 680ca1be68f88d4f658be017f244beca503c3978 = HEAD blob, git status --porcelain empty.

So the page is genuinely in the compiled tier and the gate would catch a regression on it.

Gates — all on head 61759cfcc, exit codes captured by redirect-then-capture

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 — 2 files, 123 tests
pnpm exec vitest run scripts/__tests__/ (whole directory) 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 — 32 pre-existing warnings, 0 errors, none in either changed file
pnpm check:control-bytes 0
grep -naP control-byte self-scan of both changed paths 1 (no match — clean)
node scripts/check-changeset-presence.mjs 0 — "no changeset is owed" (0 of 2 changed files are published source or a moved contract)
node scripts/check-governed-queue-guard.mjs --test (both paths) 0 — NOT GOVERNED
pnpm check:entry-guard 0

Build closure rebuilt on the merged head before any measurement: pnpm exec turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2 → exit 0, 35/35 tasks.

No changeset: check-changeset-presence.mjs is the authority and it says none is owed. No label was applied.

Live E2E (informational) is red on every branch today for an upstream reason (#7990 / objectstack#16186) — not from this change.


Generated by Claude Code

…rface

Burns down the `packages/plugin-ai/README.md` entry in this gate's
`UNGATED_DOCS` ledger (objectui#5174, batch 27). The entry is deleted
rather than rewritten because the page now reads zero.

The page taught an API the components do not have. All three exported
components take a single `schema` prop plus callbacks
(`AIFormAssistProps`, `AIRecommendationsProps`, `NLQueryInputProps`),
while every example passed flat props -- `formId=`, `objectName=`,
`fields=`, `maxResults=`, `layout=`. The README was wrong against
components that are right, so the README is what moves: one typed
binding per example, annotated with the schema type `@object-ui/types`
exports, passed as `schema={...}`, with `declare const` stand-ins for
the two ambient names the page never defined.

Three of the four `tsx` fences were bare JSX with no import line, so
the undefined component name short-circuited the prop check on the
same element: the ledger's `TS2322x3` was the visible half of six.
The three latent ones surface only once the names resolve, and this
diff pays down all six.

No `packages/plugin-ai/src/**` or `packages/types/src/**` edit, no
widened type, no fragment marker, no loosened gate. The gate file's
strictness region is byte-identical.

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

Keeps the batch-27 work on a head that carries #8159. The merged commit
touches packages/plugin-charts, packages/types/src/data-display.ts and
content/docs/plugins/plugin-charts.mdx -- disjoint from this branch's
file surface (packages/plugin-ai/README.md, scripts/check-doc-snippet-types.mjs),
so every gate reading in the PR body is pinned to the merged head.

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 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) 3189.7 KB 3191.4 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-BoKc0KoN.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.09KB 113.98KB
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.29KB 13.18KB
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.75KB 63.50KB
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.46KB 14.57KB
plugin-list (index.js) 113.34KB 27.72KB
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.48KB 20.81KB
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-06T22:42Z.

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 61759cfcc.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 6, 2026 22:51
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

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

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

Landing stroke follows the merge: content probe on re-fetched origin/main (const contactAssist: AIFormAssistSchema in packages/plugin-ai/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-28 claim.


Generated by Claude Code

Merged via the queue into main with commit 153d432 Sep 6, 2026
31 of 32 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-5174-doc-snippets-batch27-plugin-ai branch September 6, 2026 23:07

Copy link
Copy Markdown
Contributor Author

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

Merged at 2026-09-06T23:07:02Z as 153d43237 (squash). Content probe on re-fetched origin/main at 23:07Z: const contactAssist: AIFormAssistSchema at packages/plugin-ai/README.md:40; the 'packages/plugin-ai/README.md' row is absent from UNGATED_DOCS (0 hits) while the control row 'packages/auth/README.md' is present (1 hit); the ledger reads 10 rows; the strictness region still hashes to 2749d53ae3a8df033a53b8d7a354fa7e22ee2d1a17f6ad0c3d61122e904e084b.

Batch 28 (packages/auth/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 plugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants