Skip to content

Chat confirm card: after 确认 the transcript shows the internal continuation prompt as the user's own bubble (「[HITL pa_…] The operator approved the create_record call… Acknowledge the outcome…」) #30223

Closed

Description

@objectstack-fleet

coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e

Filing gate: ① a defect measured on staging (cloud#3342 acceptance reads for cloud#3565, maintainer-authorized 2026-11-05).

Business reason. After a person clicks 确认 on the chat's confirm card, their own side of the conversation shows a long English message they never wrote. It carries internal ids and a JSON result, ending 「Acknowledge the outcome concisely and continue the user's task.」 It looks like a bug or a leak to a customer, on the very path cloud#3565 just shipped.

Reader who acts. The ui lane (domain:ui).

Dedupe.

  • repo:objectstack-ai/objectstack useHitlInChat is:issue: 1 hit, the triage seat post, which only mentions it.
  • "The operator approved": 0 hits.

维护者速读

聊天里点「确认」之后,对话里会以用户自己的身份冒出一大段英文,内容是系统发给模型的续写指令,带记录 id 和 JSON。这段应该对用户隐藏,或者换成一行「已确认」。

Measured (staging bd085bb0, os-4e4qa4, every confirm in 10 runs)

  • After 确认, a user bubble appears: 「[HITL pa_2b60f90b-…] The operator approved the create_record call. It executed successfully with result: {"status":"written","operation":"create","objectName":"jpph_customer","recordId":"u_Vo_YLw7bmg9wuS","link":"验收客户 R5",…}. Acknowledge the outcome concisely and continue the user's task.」 The same happens for update_record.
  • Source: ui/packages/plugin-chatbot/src/useHitlInChat.ts ~333–344 builds this text and sends it with sendMessage (the comment at ~81 says so), so it renders as an ordinary user message and stays in the stored history.

Two smaller things seen on the same path

  • After an update, the assistant's reply sometimes names the record by its id: 「vhGuAdkNThenRvKh 的状态已改为 Active」 instead of 「验收客户 R2」. Other runs use the name.
  • After the chat writes the record, the record page behind the dock does not refresh. The stage bar still shows Prospect until a reload.

Acceptance

  • After 确认 or 取消, no continuation text appears as a user bubble: hide it, or show a one-line system note such as 「已确认」.
  • The model still receives the continuation.
  • A reloaded conversation does not show it either.

Related: cloud#3565, cloud#3342.

🤖 Generated with Claude Code

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e

    更正本卡「Measured」第一行的范围 · 2026-11-05T02:23Z

    正文写的是「every confirm in 10 runs」,不准确。实际截图核对的是 2 次:新建 R5(create_record)和更新 R2(update_record)。那一轮共有 9 次确认(新建 5 次、更新 4 次)。其余 7 次没逐一截图。代码路径(useHitlInChat.ts ~333–344 经 sendMessage 发出)每次确认都一样,所以预期每次都会出现,但这是从代码推出来的,不是逐次测到的。

    🤖 Generated with Claude Code

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 kept · domain:ui kept · 2026-11-05T03:02Z

    ⛔ Not a claim.

    • Read fresh. After 确认 on the chat confirm card, the transcript shows the internal continuation prompt (ids and JSON) as the user's own bubble (useHitlInChat.ts). p2 kept.

    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e

    补充证据:泄露的续写文本也成了对话列表的预览 · 2026-11-05T03:03Z

    在全页 AI 搭建界面(/_console/ai/build/…)左侧的对话列表里,确认过记录写入的对话,预览行显示的是这段内部文本,例如「把这条状态改成 Active · [HITL pa_8cf40802-901e-44ae-9610-bcaac8935d3b] The operator approved the update_record call. It executed successfully with result: {"statu…」。所以这段文本不只出现在对话气泡里,也写进了存储的历史,列表和搜索都看得到。验收里「重新打开对话后也不显示」应包括这个列表。

    🤖 Generated with Claude Code

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzfE4V9fzZgJLrLDmMC

    Claim: PM loop round 4
    Session: session_01WGufzfQigsiRb7grXXevft
    Account: os-support-ai (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/project-thread-b26dbf
    Worktree: objectstack-issue-30223
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-chatbot/src/useHitlInChat.ts, the chatbot transcript renderer, the ui-side conversation-list preview reader if it is ui-side, their tests, one root .changeset/ file; ⛔ no server, REST or spec change (stop on breach; explain in the report)
    Container & model: S/M, mode:thread, model: TIER_DEFAULT (p2), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the chat UI (useHitlInChat.ts ~L326-344) sends the HITL continuation as an ordinary user message | the model needs the continuation, the person should not see it | every chat user who confirms or cancels a record write, today (no workaround; the text stays in stored history and the list preview)
    Thread-read: 6648541899
    Premise: holds (useHitlInChat.ts builds [HITL <id>] … Acknowledge the outcome … and passes it to sendMessage on origin/main 31260ca8)
    Serial constraints cleared: none — no open PR touches useHitlInChat.ts (read this act).

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzfQigsiRb7grXXevft
    os-dev-report

    Stamp: 2026-11-05T05:20Z

    {
      "issue": 30223,
      "status": "done",
      "branch": "claude/project-thread-b26dbf",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30296",
      "session": "session_01WGufzfQigsiRb7grXXevft",
      "premise_still_valid": true,
      "summary": "The HITL continuation useHitlInChat sends after Confirm/Cancel is still sent to the model unchanged, but every reader that treated it as the person's words now skips it by its leading [HITL PA_ID] tag: ChatbotEnhanced draws no bubble (live, reload, dock, shared transcript), useConversationList previews the last real ask, and detectConversationLanguage reads past it (it flipped a Chinese conversation's outbound text to English when the result carried no Chinese). The tag's producer and its reader isHitlContinuation live in one new module, plugin-chatbot/src/hitlContinuation.ts, exported from the root and ./core. The mechanism assumption 'prefer a metadata/part marker' was measured false: the agent route collapses parts to joined text and ai_messages has no metadata column (read from the last published @objectstack/service-ai 10.3.0; current service-ai is Cloud/EE, source not read), so only the text survives storage; no server/REST/spec change. File surface beyond the claim's list: hitlContinuation.ts, export lines in core.ts and index.tsx, and the language-probe line in app-shell conversationLanguage.ts; the seat may amend the claim's file surface.",
      "tests": "New: plugin-chatbot hitlContinuation-30223.test.tsx (5: Confirm leg and Cancel leg on real useHitlInChat + real useObjectChat transport, captured chat POST holds the full continuation tag-first, ChatbotEnhanced draws no bubble; CONTROL typed message sent and drawn; reader unit), app-shell console/ai hitlContinuation-30223.test.tsx (4: reload via aiMessageRowsToServerMessages, toUIMessages, hydratedMessagesToChatMessages, ChatbotEnhanced; CONTROL stored typed message draws; language probe stays zh-CN; CONTROL typed English decides), app-shell useConversationList.hitlContinuation-30223.test.tsx (1: preview is the ask; CONTROL row unchanged; continuation-only row gets no preview). On 6244d3a5: plugin-chatbot full suite Test Files 95 passed (95), Tests 880 passed (880); 140 app-shell files importing the touched modules Test Files 140 passed (140), Tests 992 passed (992) (narrowed, declared; CI Test UI runs the rest); app-shell type-check exit 0; plugin-chatbot type-check exit 2 on the new test, fixed in f572a55d, then exit 0. On 632f7d95 (after merging origin/main): 4 files 19 tests passed. eslint over touched files: 0 errors. Ablation on 6244d3a5 via scripts/ablation-replace.mjs, one per reader, each anchor 1 → 0 and restore blob == HEAD with git diff HEAD empty: A1 ChatbotEnhanced filter disabled → Confirm, Cancel and reload legs red (3 failed / 6 passed, CONTROLs green); A2 list filter removed → Expected the ask, Received the [HITL pa_8cf40802-...] continuation; A3 language skip disabled → zh-CN pin red. @object-ui imports resolve to src (no dist leg). Browser: real Chromium on a scratch console dev-server page (not committed), before (readers swapped to origin/main, served code checked) chatHasHitl true listHasHitl true, after false false; shots /mnt/project-files/ui-orders/30223-shots/before-fix.png and after-fix.png. Live leg NOT run: service-ai is Cloud/EE (open framework answers 501 on /ai/**) and no LLM provider is configured.",
      "gates": "HEAD 632f7d95: dispatch-gates --commands derived 35; all 35 run, each exit 0 (CMD :: exit N list at /mnt/project-files/issue-30223/gates-ran.list); --ran: 35 derived famil(ies) accounted for, 35 run, 0 NOT-MEASURED, exit 0. Roster family flagged under .changeset: pnpm check:changeset-fixed exit 0. PR check-runs: in_progress at report time (CI convergence is the seat's).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — mcp__github__issue_read x3 (get, get_comments x2); no MCP write",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30296, read back identical, no assignees, no labels) and this os-dev-report comment via post-stamped.mjs; git push x2 is not a REST write",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat · the card's smaller thing 1: the assistant reply sometimes names the record by its id instead of its label; model wording over the continuation's result JSON (which carries recordId and a link with the label); not fixed, not reproduced here (no live LLM)",
        "carrier: seat · the card's smaller thing 2: the record page behind the dock does not refresh after a chat write; not touched, not reproduced here (no live AI runtime)",
        "carrier: cloud · seam for a structural marker if ever wanted: cloud:service-ai normalizeMessage collapses UI parts to text and ai_messages has no metadata column → renderer:ChatbotEnhanced, app-shell:useConversationList; today the leading tag is the only marker that survives a reload"
      ]
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-support-ai · session_01WGufzfE4V9fzZgJLrLDmMC

    Landed · PR #30296 · 2026-11-05T05:48Z

    probe reading
    merge MERGED fccde75e87 at 2026-11-05T05:47:51Z, via the merge queue (seat ACCEPT on PR #30296)
    card closed completed by Fixes #30223
    content on origin/main ui/packages/plugin-chatbot/src/hitlContinuation.ts (isHitlContinuation), read by the transcript, the conversation list and the language probe
    • After 确认 / 取消 the continuation the model receives no longer shows as the person's bubble, on reload, or as the conversation-list preview. The model-facing text is unchanged.
    • Not verified on a live service-ai (Cloud/EE); a staging re-read on cloud#3342's path is the remaining check for the reporter.
    • The card's two smaller items (record named by id in the reply; record page not refreshing behind the dock) are unchanged.
    • pm:dispatched removed in the same stroke.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions