Skip to content

[ADR-0057] P4 follow-ups — live handoff verification + context-carrying upgrade (cloud#817) #2443

Description

@os-zhuang

Self-contained follow-up work order for ADR-0057 P4 (ask→build explicit handoff). Written for an agent with no prior context. Rolls up to epic #2409.

Background (already shipped — do NOT rebuild)

ADR-0057 P4 landed the explicit "Open in Builder →" handoff across two repos:

  • cloud — @objectstack/service-ai-studio gained a suggest_builder signal tool + an ask-only builder_handoff skill; the ask agent's instructions now call it to decline-and-redirect an authoring request (ADR-0063). Handler echoes { status: 'build_handoff', handoff: 'build', prompt, packageId? }. Merged: objectstack-ai/cloud#818.
  • objectui — plugin-chatbot detectBuilderHandoff lifts that result onto the tool invocation; ChatbotEnhanced renders the "Open in Builder →" card (onOpenBuilder prop). app-shell wires the full-page AiChatPage (ask) + the FAB to navigate to /ai/build?package=…&handoffPrompt=…; the build surface seeds that prompt as its first message. Merged: feat(console-ai): explicit "Open in Builder →" ask→build handoff (ADR-0057 P4) #2439.

Both sides are unit-tested and CI-green. Read: docs/adr/0057-console-ai-chat-one-conversation-docked.md, cloud ADR-0063 (two agents, surface-bound), ADR-0013 (durable turns).

Tasks

1 · Live end-to-end verification (ADR-0054 browser proof)

The one step not verified at merge time: the ask agent actually choosing to call suggest_builder. It was blocked in the authoring session only by that environment's egress policy denying ai-gateway.vercel.sh (403 CONNECT) — not by code or key.

In an environment where the Vercel AI Gateway is reachable (a valid AI_GATEWAY_API_KEY + AI_GATEWAY_MODEL, e.g. a real openai/gpt-4o-mini):

  • Boot the local stack (cloud/scripts/dev-local/run-stack.sh --with-ui --seed --keep, OBJECTUI_ROOT=<objectui>); put the key in cloud/scripts/dev-local/.env.local (gitignored).
  • Headless check first: POST /api/v1/ai/agents/ask/chat with a build-shaped message (e.g. "add a priority field to the tasks object") → the stream must contain a suggest_builder tool call whose result carries status: 'build_handoff'.
  • UI proof: in ask, send that request → the "Open in Builder →" card renders → click → lands on /ai/build?package=…&handoffPrompt=… and the seeded prompt auto-sends. Attach the screenshot(s).

2 · cloud#817 — context-carrying handoff (upgrade v1)

Today v1 carries only { prompt, packageId? }. Upgrade the handoff to carry the ask thread's conversation context into the Builder (durable-turn reference, ADR-0013), so build resumes with what the user already discussed — not just a one-line prompt.

  • cloud: extend the suggest_builder contract (or add a handoff-context endpoint) to reference the source conversation/turn; define what transfers.
  • objectui: consume it in the onOpenBuilder path (generalize assistant/assistantBus.ts per the ADR) instead of only the URL handoffPrompt; seed the Builder from the carried context.
  • Keep the ADR-0063 invariant: explicit, user-initiated switch — never a silent re-route.

3 · FAB dismissal polish (minor)

When "Open in Builder →" is clicked from the console FAB (ConsoleFloatingChatbot), the floating overlay does not auto-close — FloatingChatbot/FloatingChatbotProvider expose no external close control today. Add one so the FAB dismisses when it hands off to the full-page Builder (the full-page AiChatPage handoff already replaces the view, so only the FAB needs this).

References

Epic #2409 · work order #2412 · ADR docs/adr/0057-console-ai-chat-one-conversation-docked.md · merged P4: objectstack-ai/cloud#818 + #2439 · cloud#817 (context-handoff, task 2).

Activity

  1. xuyushun441-sys commented on Aug 3, 2026

    @xuyushun441-sys
    Contributor

    状态记录(2026-08-03,PM 会话)

    本单等的不是决策而是资源:task 1(live 端到端验证)需要一个 AI Gateway 可达的环境(有效 AI_GATEWAY_API_KEY + AI_GATEWAY_MODEL),由维护者提供;task 2 依赖 cloud#817;task 3 可随任一波 polish 顺手做。

    摘 needs-user-decision(无未决判断);标记为 blocked-on-environment,key 到位后 task 1 可直接派发。


    Generated by Claude Code


    Generated by Claude Code

  2. claude commented on Aug 6, 2026

    @claude
    Contributor

    分诊:pm:on-hold(三要素见下)。⚠️ 三项任务里两项前提已过时 —— 本单实际只剩 task 1。

    2026-08-03 的 PM 评论已判定「等的不是决策而是资源」并摘掉 needs-user-decision,但没有换上任何 pm:* 标签 ⇒ 此后每轮 sweep 都把它当未分诊新单重新捞起。本轮补上状态标签,同时做过时前提检查,结果比原判更收敛。

    逐任务过时前提检查(读 origin/main 与已合并 PR)

    任务 原前提 现状 处置
    1 · live 端到端验证 需 AI Gateway 可达环境 + 有效 key ✅ 仍然成立 —— PR #2444 正文亲自声明:完整 LLM 驱动的浏览器 e2e 需 run-stack + provider key + seat,CI/sandbox 不可达,故改用真实 wiring 的集成测试替代,并留下一份「Manual staging proof」步骤待环境就绪时跑 本单剩余的唯一内容
    2 · cloud#817 上下文携带升级 待 cloud#817 落地后消费 ❌ 已交付,前提作废 —— cloud#817 已 closed(completed,2026-07-13,实现于 cloud#819),契约定为 (b) parentConversationId 首轮兑现;objectui 消费端由 PR #2444 于 2026-07-13 11:04Z MERGED(useObjectChat 接受 parentConversationId、withHandoffContext 纯函数合并、首轮只发一次 + reload 不重发,含 5 个新用例) 出范围,勿重做
    3 · FAB 关闭 polish "FloatingChatbot/FloatingChatbotProvider expose no external close control today" ❌ 双重过时 ——(a) FloatingChatbotProvider 现在就导出 close()(FloatingChatbotProvider.tsx,FloatingChatbotContextValue 含 open/close/toggle/toggleFullscreen);(b) 更要紧的是 ConsoleFloatingChatbot.tsx 已从 main 删除 —— ADR-0057 P3 收尾清理移除了整条 console 浮层路径,FAB 现在打开的是 ChatDock(layout/ConsoleChatbotFab.tsx + layout/ChatDock.tsx),原描述的「浮层不自动关闭」这个形状已不可能发生 出范围,已被架构变更消解

    ⇒ 本单等价于「在一个 AI Gateway 可达的环境里,跑 PR #2444 留下的那份 staging 走查,拿 ADR-0054 浏览器实证」。⛔ 不改标为 pm:queue:它不是代码任务,派给 dev agent 只会得到「环境不可达」的空跑(#2439 授权会话当初正是被 ai-gateway.vercel.sh 的 403 CONNECT 挡住,不是代码或 key 的问题)。

    hold 三要素

    • 日期:2026-08-06(承接 2026-08-03 的 blocked-on-environment 判定,本轮补标签并收窄范围);
    • 理由:剩余唯一任务需要维护者提供资源 —— 一个 Vercel AI Gateway 可达的环境 + 有效 AI_GATEWAY_API_KEY / AI_GATEWAY_MODEL(如真实 openai/gpt-4o-mini)+ 一个 seat;代码侧两条已分别由 cloud#819 与 objectui#2444 交付;
    • 重启条件:key 与可达环境到位后即可解除,按 PR feat(console-ai): ask→build handoff carries conversation context + live verification (ADR-0057 P4) #2444 正文「Manual staging proof」段落逐步走:ask 问一个 build 形状的问题 → 出现「Open in Builder →」卡 → 点击 → /ai/build 首个 chat POST body 带 context.parentConversationId(ask 线程 id)、且 reload 不重发。⚠️ 解除时只按 task 1 定价,⛔ 不要照正文三项估工。

    建议合批:这条与 cloud 侧几条同样「只差一次人工/真实环境走查」的挂起件(cloud#844、cloud#787 的发现 B、cloud#1020)沉没成本相同 —— 都是「安排一次有真实 key 的走查」。⚠️ 建议维护者安排环境时一次覆盖四条,只付一次环境成本。⛔ 本座位不代拍,仅提请。

    查重:三仓搜 parentConversationId / suggest_builder / builder_handoff / ADR-0057 —— 未发现第二个仍在流通的派发入口;同批处理的 #2412(P1–P4 工单)已按 ADR Status 行自陈的 IMPLEMENTED IN FULL 关闭,epic #2409 已于 2026-07-14 关为 completed。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Aug 23, 2026
  4. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    ContributorAuthor

    Triage: domain:devx (lane only — pm:on-hold untouched). Landing: docs/adr/** and scripts/dev-local/** — verification tooling and the ADR record, not product surface.

    Routed via the maintainer direct-dispatch channel, this session, verbatim: 「然后 批 4–5」. PM session session_0124Qg8rLvpXnQDwCmpKUmaJ. objectui three-stream split (maintainer 2026-08-21); not a Routine triage fire — the triage seat may re-grade.


    Generated by Claude Code

  5. claude commented on Sep 13, 2026

    @claude
    Contributor

    ⭐ CONVERTED — pm:on-hold → pm:awaiting-maintainer, with a Maintainer-action: line. ⛔ This card was never waiting on a predicate; it is waiting on a person.

    PM seat domain:devx @ objectui, session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-13T15:18Z. objectui#8587 conversion sweep (director seat, decision batch #128 item 3).

    Why this is a state change and ⛔ not a Restart-when: line

    objectui#8587's ruling buckets the held population, and this card falls squarely in one of them, verbatim:

    13 waiting on a ruling | ⛔ not pm:on-hold: per the six states a card waiting on a person is pm:awaiting-maintainer with a Maintainer-action: line …

    ⇒ Triage's own 2026-08-06 hold (#issuecomment-5203720778) already established that, and said so in as many words:

    ⛔ 不改标为 pm:queue:它不是代码任务,派给 dev agent 只会得到「环境不可达」的空跑(#2439 授权会话当初正是被 ai-gateway.vercel.sh 的 403 CONNECT 挡住,不是代码或 key 的问题)。

    ⇒ ⭐ A Restart-when: probe would be a fiction here: no git grep, lockfile read or pin can observe 「a maintainer has provisioned a gateway-reachable environment」. Writing one would satisfy the sweep's letter and defeat its purpose.

    Maintainer-action: — what is actually being asked for

    Maintainer-action: provide a Vercel-AI-Gateway-REACHABLE environment with
                       a valid AI_GATEWAY_API_KEY / AI_GATEWAY_MODEL (e.g. a real
                       openai/gpt-4o-mini) and a seat, then the remaining task runs.
    Then-do:           PR objectui#2444's "Manual staging proof" walkthrough —
                       `ask` a build-shaped question -> an "Open in Builder →" card
                       appears -> click it -> the first /ai/build chat POST body
                       carries context.parentConversationId.
    Blocking-evidence: objectui#2439's authorised session was stopped by a 403 CONNECT
                       to ai-gateway.vercel.sh — ⛔ NOT a code or key defect.
    

    ⭐ Two of the card's three tasks are ALREADY DEAD — carried forward so nobody re-does them

    Triage's per-task obsolescence check, which this sweep re-confirms rather than re-runs:

    task status
    1 · live end-to-end verification ✅ the only remaining content — needs the environment above
    2 · cloud#817 context carrying ❌ delivered; premise void. cloud#817 closed completed 2026-07-13 (implemented in cloud#819); the objectui consumer landed in PR objectui#2444, merged 2026-07-13 11:04Z. ⛔ Out of scope, do not redo.
    3 · FAB close polish ❌ doubly obsolete. FloatingChatbotProvider now exports close(), and — more decisively — ConsoleFloatingChatbot.tsx was deleted from main in ADR-0057 P3 cleanup. The FAB now opens ChatDock. ⇒ ⛔ the described shape can no longer occur.

    ⇒ ⭐ The card's title still promises three follow-ups; two of them cannot happen. That is exactly the hazard objectui#8587 exists to end — ⛔ and it is why the scope narrowing belongs in a comment a reader meets, not in a triage thread they have to excavate.

    ⚠️ The history this card records about the sweep itself

    2026-08-03 的 PM 评论已判定「等的不是决策而是资源」并摘掉 needs-user-decision,但没有换上任何 pm:* 标签 ⇒ 此后每轮 sweep 都把它当未分诊新单重新捞起。

    ⇒ ⭐⭐ A card left with NO pm:* label was re-caught as untriaged by every subsequent sweep. That is the mirror of objectui#8587's main defect: a hold with no predicate is never re-measured, and a card with no state is re-measured forever. ⛔ Both are failures of the same missing thing — a machine-readable state.

    pm:on-hold → pm:awaiting-maintainer; domain:devx kept; ⛔ no priority:* produced — this card carries none and this seat does not grade. Terminal state read back below.


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    Contributor

    Closed not_planned on the maintainer's word: the live end-to-end proof of the ask → build handoff will not be run from this card

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01W89enF2dYV7K4N2Fbfj33f · 2026-09-27T03:13Z.

    Provenance. The instruction is the maintainer's. The words, verbatim: 「Governed Surface Queue Guard 已加;9430 关;7696 关;objectui#7388 关;」 and 「2443 关」. Where: the maintainer's chat with this session (session_01W89enF2dYV7K4N2Fbfj33f), 2026-09-27. It answered the second batch of pm:awaiting-maintainer cards, which this seat presented card by card.

    • What shipped and stays: the "Open in Builder →" handoff: cloud#818 (the suggest_builder signal tool and the builder_handoff skill) and objectui#2439 (the card, the navigation and the seeded prompt). Both are unit-tested and CI-green.
    • What is not done: task 1, the live proof that the real ask agent chooses suggest_builder for a build-shaped request. It needs a Vercel-AI-Gateway-reachable environment, which no seat has. The enterprise AI flow belongs to cloud's own QA, not to this repo's queue.
    • What would reopen it: a report that the card does not appear, or goes to the wrong place, on a real deployment.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions