Skip to content

fix(app-shell): the pending-drafts bar's sentence wraps on a phone instead of being cut (objectui#13088) - #13101

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-13088-drafts-bar-sentence-wraps
Oct 20, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-13088-drafts-bar-sentence-wraps

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #13088

Clause-②: no

What changed

PendingDraftsBar drew its sentence in a min-w-0 truncate span: one line, overflow: hidden, an ellipsis. On a phone the bar's row is narrower than the sentence, so the half that says users cannot see the change was cut (zh at 390 px ended 「用户还看不…」).

The span is now min-w-0 flex-1: it takes the row's free width and wraps. The publish button keeps shrink-0, so it keeps its width on the bar. The span gains data-testid="pending-drafts-bar-sentence" so the structural test finds it without reading the classes it asserts about. The bar's own row classes are unchanged (items-center kept, see H5 below).

Only packages/app-shell/src/console/ai/PendingDraftsBar.tsx changes in source (one class string, one attribute, one comment). No prop, export or published face moves: the diff neither widens nor narrows any export or prop (Clause-②: no, as the claim declared). The i18n key console.ai.pendingDrafts.count and its values are untouched. The bar's mount in AiChatPage.tsx, the preview pill and packages/plugin-chatbot/** are untouched.

Measured boxes (Acceptance 1)

Chromium headless, the rig of PR #13067 / PR #13085 reused: the worktree's console Vite dev server serving the REAL full-page AiChatPage (or the REAL ChatDockMobileSheet / ChatDockPanel), with fetch stubbed in the page (one build agent, two turns plus an apply_blueprint result, one draft in the ledger). One addition to the harness: a lang=zh|en switch on the I18nProvider. "Before" is main cd4623d as checked out (nothing edited); "after" is d45156b. Boxes are left top right bottom, CSS px. Viewports: 390 by 844, 320 by 700, 1010 by 800, 1280 by 900.

Control: before-fullpage-390-zh reads the card's numbers exactly: sentence scrollWidth 248 against clientWidth 240, bar 16 650 374 704; at 320 px, 248 against 170.

Phone widths, full-page chat:

reading sentence scroll / client lines bar button textarea bar on textarea
zh 390, before 248 / 240, cut 1 16 650 374 704 281 659 361 695 17 713 373 777 0
zh 390, after 240 / 240 2 16 646 374 704 281 657 361 693 17 713 373 777 0
zh 320, before 248 / 170, cut 1 16 506 304 560 211 515 291 551 17 569 303 633 0
zh 320, after 170 / 170 2 16 502 304 560 211 513 291 549 17 569 303 633 0
en 390, before 386 / 220, cut 1 16 642 374 696 261 651 361 687 17 705 373 777 0
en 390, after 220 / 220 2 16 638 374 696 261 649 361 685 17 705 373 777 0
en 320, before 386 / 150, cut 1 16 498 304 552 191 507 291 543 17 561 303 633 0
en 320, after 150 / 150 3 16 474 304 552 191 495 291 531 17 561 303 633 0

Other hosts and the desktop control:

reading sentence scroll / client lines bar button textarea bar on textarea
dock sheet zh 390, before 248 / 240, cut 1 16 650 374 704 281 659 361 695 17 713 373 777 0
dock sheet zh 390, after 240 / 240 2 16 646 374 704 281 657 361 693 17 713 373 777 0
full page zh 1010, before / after 248 / 248, then 554 / 554 1 / 1 314 606 986 660 (both) 893 615 973 651 (both) 315 669 985 733 0
full page en 1010, before / after 386 / 386, then 534 / 534 1 / 1 314 606 986 660 (both) 873 615 973 651 (both) 315 669 985 733 0
full page zh 1280, before / after 248 / 248, then 554 / 554 1 / 1 449 706 1121 760 (both) 1028 715 1108 751 (both) 450 769 1120 833 0
full page en 1280, before / after 386 / 386, then 534 / 534 1 / 1 449 706 1121 760 (both) 1008 715 1108 751 (both) 450 769 1120 833 0
desktop dock zh 1280, before / after 248 / 248, then 301 / 301 1 / 1 861 706 1280 760 (both) 1187 715 1267 751 (both) 862 769 1279 833 0
desktop dock en 1280, before 386 / 281, cut 1 861 706 1280 760 1167 715 1267 751 862 769 1279 833 0
desktop dock en 1280, after 281 / 281 2 861 702 1280 760 1167 713 1267 749 862 769 1279 833 0

With the phone preview pill showing above the bar (objectui#13068's column): zh 390 pill 144 606 246 642 before, 144 602 246 638 after; en 320 pill 97 454 223 490 before, 97 430 223 466 after; pill on bar 0 in all four, bar and textarea as in the first table.

At desktop widths the span's scrollWidth grows only because flex-1 now lets it fill the row; the text stays on one line and the bar, button and textarea boxes are identical before and after. In every reading the button sits inside the bar and on screen, a tap at its centre reaches it, and the page has no horizontal scroll (scrollWidth equals the viewport width).

Bar crops, before and after (zh 390, zh 320, en 390, en 320):

before zh 390
after zh 390

before zh 320
after zh 320

before en 390
after en 390

before en 320
after en 320

Full page, zh 390, after:

after full page zh 390

Where the evidence lives: commit 4d0b7e0 of this branch, directory evidence/13088/: every reading as JSON (before and after), the bar crops and full-page screenshots above plus the desktop-dock en crops, a README, the throwaway harness page and the Playwright driver. The next commit, 5dc6838, deletes the directory, so this pull request's diff does not carry it (git rev-parse d45156b^{tree} 5dc6838^{tree} prints the same tree twice). No other branch was created.

The PM's hypotheses, measured

  • H1 confirmed. The single producer is the span's truncate (computed white-space: nowrap, text-overflow: ellipsis before; normal / clip after). With the clamp gone the sentence is whole at 390 and 320 px in zh and en, on two lines (three for en at 320), and the button stays on the bar.
  • H2 confirmed. zh breaks between characters and en at spaces with no break-words; no break-all was added. At zh 390 the second line holds 「到。」 alone. text-pretty was tried and measured: the same boxes, it moved one character at 390 and split 「用户」 at 320, so it was not kept.
  • H3 confirmed. The test reads structure, finds the sentence by its data-testid, and goes red with the clamp restored (below).
  • H4 confirmed. The bar grows upward only: its bottom edge stays put in every phone reading (704, 560, 696, 552) and its top rises 4 px for two lines or 24 px for three. The textarea's box does not move, and bar on textarea is 0 at 390 and 320 px in zh and en, in the full page and the dock sheet. With the pill showing, the pill rises by the same 4 or 24 px and stays clear of the bar. AiChatPage.draftsBarInFlow-12978.test.tsx and AiChatPage.previewPillInFlow-13068.test.tsx are untouched and green.
  • H5: items-center kept. The button is centred against the wrapped sentence (11 px above and below it in the 58 px zh 390 bar, 21 and 21 in the 78 px en 320 bar), fully inside the bar, on screen, and reachable by a tap at its centre. items-start would pin it to the first line and leave an empty band under it beside a three-line sentence, so the row's alignment does not change.
  • H6 confirmed for the full page at 1010 and 1280: one line, boxes identical. One new fact: the desktop dock (a 420 px column) cut the en sentence as well (386 against 281). The same change wraps it there onto two lines, the bar 4 px taller, upward.

Tests (Acceptance 2)

  • packages/app-shell/src/console/ai/__tests__/PendingDraftsBar.sentenceWraps-13088.test.tsx (new). The real PendingDraftsBar with one pending draft. happy-dom runs no layout and loads no stylesheet, so it reads the structure that decides whether the sentence can wrap: the sentence element (by data-testid) holds the whole sentence and carries no one-line clamp (truncate, whitespace-nowrap, text-nowrap, text-ellipsis, overflow-hidden, overflow-x-hidden, overflow-clip, line-clamp-*); nothing from it up to the bar hands it white-space: nowrap by inheritance (truncate, whitespace-nowrap, text-nowrap); the publish button is on the same bar.
  • Ablation 1: fix committed, then the sentence's class put back to min-w-0 truncate with its data-testid kept (ablation-replace.mjs, anchor 1 to 0 on disk, blob f409ec4 to b843724). The new test went red, Tests 1 failed (1), on expected [ 'truncate' ] to deeply equal []. Restored: blob equals HEAD (f409ec4) and git diff HEAD empty. Reverting the whole file to main also turns it red, but on the missing handle, which is why the class-only leg is the one recorded.
  • Mutation 2: whitespace-nowrap added to the bar's row, the sentence untouched. Red, Tests 1 failed (1), on expected [ 'div whitespace-nowrap' ] to deeply equal [], the inherited-clamp reading. Restored and proved the same way.
  • pnpm exec vitest run on the new test plus PendingDraftsBar.test.tsx: Test Files 2 passed (2), Tests 3 passed (3).
  • The whole @object-ui/app-shell suite on head 5dc6838 (pnpm --filter @object-ui/app-shell test, which is vitest run --root ../.. packages/app-shell/): Test Files 1613 passed | 1 skipped (1614), Tests 15041 passed | 9 skipped (15050), exit 0. It includes AiChatPage.draftsBarInFlow-12978.test.tsx, AiChatPage.previewPillInFlow-13068.test.tsx and PendingDraftsBar.advisoryReachesAuthor.test.tsx, all untouched.

Gates (local subset; the farm is CI's)

Each exit code was captured to a file before any pipe, on head 5dc6838 (tree eeb2438, the same tree as d45156b).

  • pnpm --filter @object-ui/app-shell lint: exit 0 (0 errors, warnings only; none in the changed files).
  • pnpm --filter @object-ui/app-shell type-check: exit 0, after building the package's dependency closure (turbo run build --filter='@object-ui/app-shell^...', 28 tasks successful). tsconfig.test.json includes src/**/*.test.tsx, so the new test is compiled.
  • pnpm --filter @object-ui/app-shell test: exit 0 (Test Files 1613 passed | 1 skipped (1614)); about 60 minutes on the shared four-core box, under the shared verify lock.
  • pnpm check:new-line-citations 0 (0 new citation(s)), pnpm check:control-bytes 0, pnpm check:vi-mock-specifiers 0, pnpm check:vi-mock-inherit 0, pnpm check:vi-mock-override-shape 0, pnpm check:test-path-roots 0, pnpm check:unreferenced-sources 0, pnpm check:changeset-claims 0, pnpm check:pending-changeset-literals 0, node scripts/check-changeset-presence.mjs 0 (2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)), node scripts/check-changeset-no-major.mjs 0.
  • Changeset: .changeset/13088-drafts-bar-sentence-wraps.md, @object-ui/app-shell patch.

Acceptance notes


Generated by Claude Code

…stead of being cut

The bar drew its sentence in a `truncate` span, so on a phone the row was
narrower than the sentence and its second half (users cannot see the change
yet) was cut with an ellipsis. The span now takes the row's free width and
wraps (`min-w-0 flex-1`); the publish button stays `shrink-0` on the bar.
The span gains a `data-testid` so a structural test can find it without
reading the classes it asserts about.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
…s sentence, before and after

Throwaway: the next commit deletes this directory, so the pull request's diff
never carries it. Kept reachable through this commit's SHA.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
The readings stay reachable through the previous commit's SHA.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3208.9 KB 3744.1 KB
Main entry chunk (gzip) 81.5 KB 350 KB
Entry file index-B_Dtkxko.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 615.08KB 149.86KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 252.05KB 70.40KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.40KB 12.01KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.14KB 23.42KB
plugin-chatbot (index.js) 238.47KB 56.30KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 265.63KB 70.60KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 184.11KB 47.60KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 272.91KB 75.73KB
plugin-kanban (index.js) 64.49KB 19.83KB
plugin-list (index.js) 149.64KB 39.21KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · objectui#13088 · PR #13101 · domain:ui#1 · session_014MXhk1yjWh37d634hLy3p7 · 2026-10-20T00:24Z

Head 5dc6838d9f7181a85da767ab440eb1433c3ce197. Reviewed against the claim 6279118272 and the dev report 6280336083 on objectui#13088, read on GitHub rather than from the report. No contract-review record is owed: the claim and the PR body read Clause-②: no, PendingDraftsBar is internal to @object-ui/app-shell, its props do not move, and there is no schema and no governed path.

  1. Shape: draft PR against main. The body's first line is Fixes #13088, the only closing keyword. Assignee huangyiirene. 3 files, +120 / −1: one class string and one data-testid in PendingDraftsBar.tsx (plus a comment), one new test, one patch changeset. Not Tier H. The evidence commit 4d0b7e0 is deleted by 5dc6838 (both trees read eeb2438), and the merge queue squashes, so no evidence file reaches main.
  2. Premise, re-measured: at cd4623d the sentence sat in <span className="min-w-0 truncate">. The dev's "before" control reads the card's numbers exactly (zh 390: scrollWidth 248 against clientWidth 240, bar 16 650 374 704; zh 320: 248 against 170), and en was cut too (386/220 at 390, 386/150 at 320).
  3. Acceptance 1: after the change, scrollWidth equals clientWidth at 390 and 320 px in zh and en (2 lines; 3 for en at 320). The bar grows upward only, the textarea box does not move, and bar ∩ textarea is 0 in every reading. The publish button stays inside the bar and on screen. With the phone preview pill showing, the pill rises by the same amount and pill ∩ bar is 0. Desktop full page at 1010 and 1280: one line, with bar, button and textarea boxes identical before and after.
  4. Acceptance 2: PendingDraftsBar.sentenceWraps-13088.test.tsx finds the sentence by its own data-testid. It asserts the whole sentence text, no one-line clamp class on it, no inherited nowrap class from the sentence up to the bar, and the publish button on the bar. The ablation (span back to min-w-0 truncate, testid kept) goes red on expected [ 'truncate' ] to deeply equal []. A second mutation (whitespace-nowrap on the bar row) goes red too. The restore was proved by blob hash.
  5. Gates: the dev's local runs at 5dc6838: app-shell lint, type-check and the full app-shell test suite (1613 files passed, 1 skipped) exit 0. So do check:new-line-citations, check:control-bytes, the vi-mock family, test-path-roots, unreferenced-sources, changeset-claims, pending-changeset-literals, changeset presence and no-major. The flip to ready waits for every check-run on this head to be green or an expected skip.
  6. Accepted deviations:
  7. Out of scope: PendingDraftsBar's header comment still says the bar floats above the composer, but since PR fix(app-shell,plugin-chatbot): lay the pending-drafts bar out above the composer, not over it (objectui#12978) #13067 it is a row in flow. This is comment drift only. It is noted in the PR, and nothing is filed.
  8. Landing: not Tier H, and no contract-review face is hit, so needs:contract-review is not hung. Once the check-runs on this head are green, the seat flips the PR to ready and enables auto-merge.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 20, 2026 00:32
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 20, 2026 00:32
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit a26068b Oct 20, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-13088-drafts-bar-sentence-wraps branch October 20, 2026 00:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AI build chat on a phone: the pending-drafts bar cuts its own sentence (zh 「用户还看不…」 at 390 px), so the reason to publish is unreadable

2 participants