Repository navigation
fix(console-ai): #2450 stale-scope pane swallow + capability-based rendering (cloud#816) + ADR-0057 decisions - #2452
Merged
Conversation
…le-scope pane (#2450) Root cause: mid ask→build transition useChatConversation briefly holds the OLD scope's id (the window the URL-mirror already guards); ChatPane was fed that raw id, mounting a doomed pane whose deferred replay consumed the handoff stash — the send died with the unmount before the wire (live symptom: zero POST). - Scope-gate the pane feed: ChatPane gets id/messages only when conversationScope === chatScope; stale window mounts as :pending and the stash replays once in the correctly-scoped pane. - Target the handoff stash (targetAgentRoute:'build'); useDeferredFirstSend holds a targeted stash in mismatched-agent panes. Untargeted sends unchanged. Unit-tested (held-then-replayed across re-bind; untargeted legacy behavior). Closes #2450. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…#816) plugin-chatbot: AgentDescriptor.capabilities + agentHasCapability() (declared wins; isBuildAgent(name) fallback for older servers). app-shell: debug drawer / showDebug → 'debug', FAB resume-vs-fresh → 'resume', HomePage buildAvailable → 'authoring'. Product-axis sites (resolver, chatScope, picker availability) stay name-based by design. Unit-tested; plugin-chatbot + app-shell build clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… affordance) + status → Accepted Open questions 1–3 decided 2026-07-13 (product owner): chat docks right with properties folded into a center tab; the FAB survives as the dock's collapsed affordance; P4 handoff is explicit and shipped (second handoff onto a pending blueprint auto-sends; the agent decides merge/supersede). Status reflects P1/P2/P4 shipped, P3 planned (plan on epic #2409). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three related ADR-0057 items in one reviewable set (companion backend: objectstack-ai/cloud#821, merge-order independent but pair-merged):
1. Closes #2450 — second handoff's auto-send died in the stale-scope pane
Root cause (sharper than the issue's hypothesis): mid ask→build transition,
useChatConversationbriefly still holds the OLD scope's conversation id — theexact window the URL-mirror already guards (
conversationScope !== chatScope)— but
<ChatPane>was fed the RAW id. A doomed pane (build chatApi + stale askid, about to remount) could mount, and the deferred first-send replay consumed
the handoff stash into it; the send died with the unmount before reaching the
wire. Live symptom: conversation resumes, zero
…/chatPOST.when
conversationScope === chatScope; during the window it mounts as…:pending, holds the stash, and replays once in the correctly-scoped pane.targetAgentRoute:'build';useDeferredFirstSendrefuses to consume atargeted stash in a pane bound to another agent. Untargeted user sends keep
consume-anywhere behavior.
Per product decision: a second handoff landing on an Awaiting-Approval blueprint
just auto-sends; the agent sees the pending plan in context.
2. cloud#816 consumption — render behavior by declared capability
AgentDescriptor.capabilities+agentHasCapability(agents, name, cap)(declaration wins; falls back to
isBuildAgent(name)when absent, so it worksagainst older servers). Applied to the behavior sites: build-doctor drawer +
showDebug→'debug', FAB resume-vs-fresh →'resume', HomePage "Build withAI" availability →
'authoring'. Product-axis sites (P2 resolver, conversationscope keying, picker availability) intentionally stay name-based.
3. ADR-0057 doc — decisions recorded, Status → Accepted
Open questions 1–3 decided (chat right-dock; FAB = collapsed affordance;
explicit handoff shipped); Status reflects P1/P2/P4 shipped + P3 planned
(implementation plan).
Tests
32/32 across
useDeferredFirstSend(held-then-replayed across re-bind),useObjectChat.handoffContext, newagentCapabilities(declared-wins /fallback / alias-aware),
agentAliases,FloatingChatbot; plugin-chatbot +app-shell package builds (tsc) clean.
🤖 Generated with Claude Code