Repository navigation
fix(app-shell): a URL parameter never sends a message on the AI build page (objectui#12493) - #12536
Merged
objectstack-fleet[bot] merged 2 commits intoOct 15, 2026
Merged
Conversation
… page (objectui#12493) The build page no longer reads ?handoffPrompt= from the URL. The in-app "Open in Builder" handoff from the ask surface now travels as react-router navigation state, which only the app's own navigate() can set, and the prompt is removed from the history entry as it is seeded so a reload does not send it again. A stale parameter in an old link is ignored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…nder (objectui#12493) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ Console Performance Budget
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
Size Limits
|
objectstack-fleet
Bot
deleted the
claude/issue-12493-handoff-never-sends
branch
October 15, 2026 15:26
This was referenced Oct 15, 2026
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.
Fixes #12493
Clause-②: no
What changed
The AI build page (
packages/app-shell/src/console/ai/AiChatPage.tsx) no longer reads?handoffPrompt=from the URL. A URL can no longer send a message to the build agent on the signed-in user's behalf. A stale parameter in an old link is ignored, and the existing URL mirror drops it once the conversation id is in the URL.asksurface's "Open in Builder" handoff (ADR-0057 P4, ADR-0063 decline-and-redirect) now callsnavigate('/ai/build', { state: { handoffPrompt, parentConversationId } }). The page reads it withuseLocation().state. Only the app's ownnavigate()call can set that state. The user's click on the handoff card is the action, so the handed-off text is still sent once on arrival, as before.?package=stays in the URL because it only scopes the surface and sends nothing.handoffPrompt, and a reload does not send it again.parentConversationIdstays in the entry until the URL mirror navigates to/ai/build/IDwithout state, as the URL parameter did before. Seeding is armed once per history entry (location.key), not per prompt value, so a second handoff with the same text still seeds. The seed effect now runs before the route canonicalization and URL mirror effects. If they all run in the same flush, the mirror's navigation therefore wins over this same-URL replace.Census
searchParams.get/useSearchParamsinpackages/app-shell/src/console/ai/: onlyAiChatPage.tsxreads URL parameters (new,package,agent, and before this changehandoffPrompt/parentConversationId).new,packageandagentonly select or scope a conversation and send nothing.stashPendingFirstMessage,autoSend,initialPromptandpendingFirstMessageRef.current =acrosspackages/app-shell/srcandpackages/plugin-chatbot/src: the handoff seed was the only out-of-band seed.handoffPromptacross the repo (packages, apps, docs, tests): the only producer wasopenBuilderin this file. The other hits are CHANGELOG entries. No other producer needs a URL, so no prefill seam is kept.Tests
New:
packages/app-shell/src/console/ai/__tests__/AiChatPage.handoffNeverFromUrl-12493.test.tsx. It renders the real page and fakes the chat hook so that everysendMessagecall is recorded.?handoffPrompt=on the build route sends nothing (sentstays[]after the conversation mints and the mirror lands).openBuilderreached from the pane'sonOpenBuilder, sends its text exactly once. The URL never carries it, and the build agent's first turn carries the source conversation id.handoffPrompt.Gate readings, at head
ea7adc772:pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build: exit 0.pnpm --filter @object-ui/app-shell type-check(tsc --noEmit && tsc -p tsconfig.test.json; the test project compiles__tests__): exit 0.pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/console/ai/: exit 0,Test Files 36 passed (36),Tests 210 passed (210).pnpm check:control-bytes,check:i18n-keys,check:handler-key-readsandcheck:unreferenced-sources, plusnode scripts/check-changeset-fixed.mjs: all exit 0.eslint --no-inline-config) on the 2 changed source files: 0 errors and 34 warnings. All 34 warnings are inAiChatPage.tsx, and the base file at1c3b0699ahas the same count (0 errors, 34 warnings). ① Population:eslint.config.jslints both files (--format jsonreturned 2 file results). ② File count: 2, read from that JSON. ③ Invariance: type-aware linting is not enabled (noparserOptions.project/projectServiceineslint.config.js), so this diff cannot change the verdict on any untouched file. The repo-widepnpm lintis left to CI.Ablation, done after the fix was committed.
node scripts/ablation-replace.mjs(from objectstack) restored the URL read in the seed effect, using the old value-keyed guard. The anchor count went 1 to 0 and the blob changed from8b7df383tobb8a2768. Result:× a page loaded with ?handoffPrompt= sends nothing, withAssertionError: expected [ ... ] to deeply equal []andTests 1 failed | 3 passed (4). The other three pins stayed green. Restore was proven byblob == HEAD (8b7df3836950)and an emptygit diff HEAD.Acceptance notes
packages/plugin-chatbot/src/useObjectChat.ts(around lines 800-805) has a comment saying the URL mirror strips "the param" after a handoff send. The behaviour it describes still holds, because the mirror's state-less navigation dropsparentConversationId. Only the wording is stale. It is outside this card's file surface, so it is left for whoever next edits that file.Generated by Claude Code