Skip to content

AI build chat (full page): the floating pending-drafts bar covers the composer's input line, so the placeholder and the first typed line are hidden #12978

Closed

Description

@objectstack-fleet

Part of #12724. Filed by the repo:cloud#2 seat (seat post objectstack-ai/objectstack#24145, session session_01Cbdek8SKSHxddGqTPZXdqX), which dispatches #12724 on the maintainer's order (「objectui #12724 和 #12725 你也负责派发。」). Source: the #12965 dev report on PR #12975, out-of-scope finding 1 (class a, user-visible occlusion). ⛔ Not a claim.

What was measured

Target

The full-page chat keeps its bar, because there is no Studio top bar there to carry 变更 and 发布. The bar never covers the composer. It sits in the layout above the composer (or the composer's area makes room for it), at every width the chat supports, and the same holds for the console dock if it draws the bar.

File surface

packages/app-shell/src/console/ai/AiChatPage.tsx (where ChatPane mounts the bar), tests beside it, a changeset. ⛔ Not PendingDraftsBar's own behaviour, and not packages/plugin-chatbot/** unless a prop it already declares is missing.

Acceptance

  1. A test: with a pending draft on the full-page chat, the bar's box and the composer's input do not intersect. The same for the console dock, if it draws the bar.
  2. Screenshots at 1010 and 1280 px, with the placeholder visible whole and the bar visible.
  3. pnpm --filter @object-ui/app-shell test is green.

Dedupe

300 objectui issues (open and closed, by last update) scanned for PendingDraftsBar, "pending drafts bar" and 尚未发布 with composer or 输入: the only hits are #12965 (the Studio copilot) and PR #12975.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drives
    on Oct 18, 2026
  2. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage (first touch): grade and lane confirmed (p2, domain:ui) · filing-gate answers supplied · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-19T14:31Z

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch. This is the first triage touch. The filer applied the labels, and the body lacked filing-gate answers. Under the maintainer's ruling of 2026-10-19 (「B」: triage completes what it can derive and grades, and does not close), this comment supplies them.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (priority:p2, bug)
    Session: session_014MXhk1yjWh37d634hLy3p7
    Account: huangyiirene (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12978-drafts-bar-composer
    Worktree: objectui-issue-12978
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/app-shell/src/console/ai/AiChatPage.tsx (the ChatPane mount of PendingDraftsBar, the absolute bottom-20 float, about :2508 to :2522 at objectui main 50ba1bb), tests beside it under packages/app-shell/src/console/ai/, and one .changeset/12978-drafts-bar-composer.md. The console dock's mount (packages/app-shell/src/layout/ChatDock.tsx) only if the dock draws the bar. Per the card: not PendingDraftsBar's own behaviour, and not packages/plugin-chatbot/** unless a prop the fix needs is missing there. Stop on breach; explain in the report.
    Container & model: M (layout judgment, not mechanical), mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over this surface reads no path-derived mandate)
    Clause-②: yes
    Responsibility: the risk is produced by objectui's own ChatPane (AiChatPage.tsx), which floats the bar over the composer; the platform path that covers it: none (objectui#12965 / PR #12975 removed the bar inside the package's Studio only); who reaches it: every user of the full-page AI build chat with a pending draft, measured at 1280 × 900 (card body).
    Thread-read: 6269707915
    Serial constraints cleared: no open objectui PR touches AiChatPage.tsx (open PRs #13058, #13053 and #13050, file lists read at this claim) and no in-flight claim names it. objectui#12725 (re-queued 2026-10-19T15:55Z, dispatched by the repo:cloud#2 seat on the maintainer's order) may touch the same file: whichever lands second merges main. Same-day churn: 76f91f8 (PR #12973) changed this file after the card was filed.

    Why Clause-②: yes: the route is not chosen yet. Keeping the bar in the layout above the composer may need an in-flow slot on ChatbotEnhanced, and a new prop there widens @object-ui/plugin-chatbot's public face. Declared yes because the declaration has to cover a route the dev has not picked. If the delivered PR changes no export or prop, the in-seat review records that the widening did not happen.

    Claimed at: 2026-10-19T16:08Z

  4. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12978,
    "status": "done",
    "branch": "claude/issue-12978-drafts-bar-composer",
    "pr": "#13067",
    "session": "session_014MXhk1yjWh37d634hLy3p7 (subagent: the parent PM session's id)",
    "premise_still_valid": true,
    "summary": "ChatPane no longer floats PendingDraftsBar (absolute bottom-20, a sibling of the chat column) over the composer. It hands the bar to a new optional ChatbotEnhanced prop, promptHeaderSlot, which renders an in-flow row at the top of the prompt area, above the input and outside its form, with empty:hidden so content that renders nothing takes no space. The conversation gives up the room instead, at every width. Same condition as before (isBuildSurface && !onBoundPackageStudio), so the package's own Studio still draws no bar. The console dock mounts the same ChatPane, so it is fixed by the same change; ChatDock.tsx is not edited. The PM hypotheses, as measured: H1 true. H2 true: the dock resolves the build agent through resolveSurfaceAgent (maker convergence; or a catalog with no ask) and drew the bar over its input, 387 by 51, before the fix. H3 true (happy-dom boxes are zero), so the unit test pins structure and the boxes come from Chromium. H4: headerSlot is in flow but at the top of the column; promptOverlaySlot clears the input but covers the bottom 54 px of the conversation viewport (648 by 54 at 1280), so a new in-flow prop was needed (narrowest: one optional ReactNode). H5: the phone preview pill covers the textarea (101 by 35 at 390) both before and after; after the fix it no longer touches the bar; reported, not changed. The delivered diff widens @object-ui/plugin-chatbot's public face by exactly one optional prop (ChatbotEnhancedProps.promptHeaderSlot). No export is added or removed and no existing prop changes. The changeset is plugin-chatbot minor, app-shell patch. The card's assignee was already huangyiirene; I did not touch it.",
    "tests": "New pin packages/app-shell/src/console/ai/tests/AiChatPage.draftsBarInFlow-12978.test.tsx: the real AiChatPage at /ai/build?package=PKG and the real ChatDockPanel default body, each with the real ChatPane, ChatbotEnhanced and PendingDraftsBar and one pending draft. It asserts four things: the nearest common element of the bar and the textarea holds no role=log; nothing out of flow (absolute, fixed, sticky) lies on either path; the bar's row precedes the input's row; the bar is outside the form. Result: Tests 2 passed (2). New pin packages/plugin-chatbot/src/tests/ChatbotEnhanced.promptHeaderSlot-12978.test.tsx: Tests 2 passed (2). Ablation, after committing the fix (8d6c70a): AiChatPage.tsx put back to 50ba1bb with the slot prop kept, trap-guarded. On disk, promptHeaderSlot= went 1 to 0. Result: Tests 2 failed (2), received holdsConversation true and outOfFlow ['div absolute']. The restore was proved by blob hash == HEAD and git diff HEAD = 0 lines. Reverse type check: the README snippet compiles --strict against the rebuilt plugin-chatbot dist (exit 0); a misspelled promptHeaderSlotX is refused with TS2322 'Did you mean promptHeaderSlot'. Full suites on tree 987ea4f (commit 8d6c70a, identical to the HEAD b24726f tree): pnpm --filter @object-ui/app-shell test gave Test Files 1593 passed | 1 skipped (1594), Tests 14897 passed | 9 skipped (14906), exit 0, Duration 4185s on a shared box; pnpm --filter @object-ui/plugin-chatbot test gave Test Files 79 passed (79), Tests 772 passed (772), exit 0. Browser (Chromium, real AiChatPage and ChatDockPanel, fetch stubbed): the before control at 1280 reproduces the card's live boxes exactly (bar 401 766 1169 820, textarea 450 769 1120 833, 670 by 51). After the fix the intersection area is 0, with 5 of 5 first-line points on the input, at full page 1280, 1010, 768 and 390 and in the dock at 1280 and 1010. Screenshots and JSON are on commit baab260 under evidence/12978/ (deleted at b24726f).",
    "gates": "Local, exit codes captured before any pipe. @object-ui/plugin-chatbot: type-check 0, lint 0 (warnings only, none in the changed files), test 0. @object-ui/app-shell: type-check 0 (tsconfig.test.json --listFiles counts both new or changed test files), lint 0 (warnings only, none in the changed files), test 0. Repo checks, all 0: check:new-line-citations ('VERDICT ... 0 new citation(s)'), check:control-bytes, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:test-path-roots, check:pending-changeset-literals, check:changeset-claims, check-changeset-presence.mjs, check-changeset-no-major.mjs. check:readme-exports exit 1 is a PRECONDITION: 7 unbuilt packages, none of them this README; --list judges the new snippet's imports 'real'. Read it as NOT MEASURED for the unbuilt rows, not red. check:doc-snippets: NOT MEASURED, reason: it needs the whole doc build closure, so it is CI's; the snippet was compiled by hand instead. i18n gates do not apply (no key or user-facing string touched). dispatch-gates.mjs refuses objectui, so this list is derived by hand. CI check-runs on b24726f at report time: Changeset Fixed Group Check success, Changeset Bump Policy success, label success; Test shards 1-16, Type Check, Lint, Build & E2E, Build Docs, Repo Gates, Changeset Declaration, Changeset Claim Re-read, Line Citation Gate, Governed Surface Queue Guard, Bundle Analysis and Test (dist pins) in_progress.",
    "mcp_calls": "0",
    "api_writes": "2 relay strokes, each sent as POST /repos/objectstack-ai/objectstack/dispatches. (1) pr_create became POST /repos/objectstack-ai/objectui/pulls (draft #13067) and POST /repos//issues/13067/assignees (huangyiirene); read back 10123 of 10123 bytes, identical. (2) comment became POST /repos//issues/12978/comments (this report). Plus git push of the branch (not REST).",
    "deviations": "(1) Files beyond the claim's listed surface: packages/plugin-chatbot/src/ChatbotEnhanced.tsx (the missing prop, which the claim allows), a new test beside it, and packages/plugin-chatbot/README.md (a docs paragraph for the new prop, per objectui AGENTS #2). (2) The full-page case in the new test mounts the real AiChatPage rather than ChatPane alone. (3) Evidence was committed on the PR branch at baab260 and deleted at b24726f; the final tree equals 8d6c70a's (both 987ea4f); no extra branch was created. (4) The browser rig is a harness page with stubbed fetch, not a live backend; it is validated by the before control matching the card's live boxes. The dock frame around the real ChatDockPanel is a stand-in, not ConsoleLayout. (5) Gates beyond the brief's list were run (both packages' type-check and lint, the vi-mock and changeset checks); readme-exports was precondition-limited and doc-snippets was left to CI. (6) The app-shell suite held the verify lock for about 70 min, and the lock printed a holder-side starvation notice. (7) A stray 6-byte pid file /test.pid was left at the filesystem root: a shell slip wrote it there, and the harness safety check refused its removal. Please delete it by hand. (8) Diff: 7 files, +410 / -18.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a (user-visible occlusion) · reach: public door, the full-page /ai/build on a phone (390 x 844): after previewing a built app and closing the preview, the floating 'Preview app' pill (data-testid ai-chat-mobile-preview-open, absolute inset-x-0 bottom-24 in ChatPane, AiChatPage.tsx) covers the composer textarea by 101 by 35 px, and the middle first-line point hits the pill; measured in Chromium both before and after this PR (box 144 712 246 748 against textarea 17 713 373 777). Screenshots before-fullpage-390-pill.png and after-fullpage-390-pill.png on objectui commit baab260, evidence/12978/. Dedupe words: mobile preview pill, ai-chat-mobile-preview-open, Preview app covers composer, bottom-24",
    "carrier: 承接者:无 · promptOverlaySlot (ChatbotEnhanced) has no consumer anywhere in objectui; zero pull; noted in the PR's Acceptance notes only, not filed"
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #13067 comment 6273988608 · contract review 6273955578 (TIER_DEFAULT, PASS, head b24726f) · domain:ui#1 · session_014MXhk1yjWh37d634hLy3p7 · 2026-10-19T18:10Z. Out-of-scope finding filed as #13068. The flip to ready and auto-merge wait for green check-runs on this head.

  6. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    LANDED · domain:ui seat 1 · session_014MXhk1yjWh37d634hLy3p7 · 2026-10-19T18:31Z · pm:dispatched cleared

    reading value
    PR #13067 merged through the merge queue at 2026-10-19T18:30Z; merge commit 51269f0, which git merge-base --is-ancestor places on origin/main (exit 0). The commit message names no model.
    queue no gh-readonly-queue/main/pr-13067-* branch remains
    landed content on origin/main, AiChatPage.tsx passes the bar as promptHeaderSlot= (1 hit); the old absolute bottom-20 wrapper is gone (the 1 remaining hit is the comment at :2550 that records it)
    records claim 6271662244, dev report 6273891778, contract review 6273955578 (TIER_DEFAULT, PASS), ACCEPT 6273988608
    closing closed completed at 2026-10-19T18:31Z by objectstack-fleet[bot], about a minute after the merge (the PR body carries Fixes #12978); pm:dispatched is removed in this act

    Out of scope, carried: the phone preview pill covering the input is #13068.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions