fix(canvas/chat): A2A hints point at Activity tab (closeout internal#212) #1617
Reference in New Issue
Block a user
Delete Branch "fix/canvas-chat-a2a-hint-activity-tab-closeout-212"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
44affbde(2026-05-18) closed the primary internal#212 defect — the chat error banner now renders the secret-safeACTIVITY_LOGGED.error_detailand a working "View activity log" button (verified on main, 8/8 tests green).This PR is the closeout —
a2aErrorHint.tsstill emitted two hint strings pointing users at non-existent surfaces:"...Check the workspace's container logs for the traceback...""...Check the workspace logs or try restarting."Neither workspace logs nor container logs maps to a UI affordance — that was the original #212 framing. Both now route to the Activity tab, which IS the in-product logs surface.
Root cause of "see workspace logs -> no Logs tab visible"
The banner copy at
useChatSocket.ts:85anda2aErrorHint.ts:{41,53}was authored before the Activity tab existed; the dangling"see workspace logs"pointer survived because nothing in CI asserted on user-facing copy.44affbdefixed the banner path; this PR fixes the two surviving hint strings.Files changed
canvas/src/components/tabs/chat/a2aErrorHint.ts— replace 2 user-facing strings with Activity-tab pointerscanvas/src/components/tabs/chat/__tests__/a2aErrorHint.test.ts— pin the new copy, ban regressions toworkspace logs/container logsTest plan
npx vitest run a2aErrorHint.test.ts ChatTab.errorBanner.test.tsx useChatSocket.test.tsx-> 19/19 greenChatTab.errorBanner.test.tsxconfirms banner shows reason + "View activity log" affordance (pre-existing)Refs
44affbdefeedback_surface_actionable_failure_reason_to_user(CTO 2026-05-17)feedback_upstream_docs_first_before_hypothesizing— n/a (pure UI copy fix, no third-party framework involved)core-qa five-axis lens (PR#1617 closeout internal#212)
Verdict: APPROVE. Tiny, surgical, well-tested. The two stale "logs"
pointers in
a2aErrorHint.ts(lines 41 + 53 of pre-image) are reroutedto the Activity tab, matching the in-product affordance landed by
44affbde(ChatErrorBanner+SidePanel.tsx:30,300panel-id"activity"label"Activity").Correctness. The new copy says "Open the Activity tab" — the label
the user actually sees in
SidePanel.tsx:30 { id: "activity", label: "Activity" }.setPanelTab("activity")(line 47/234/248) is the sameid, so the verbal pointer matches a real surface. No drift.
Test coverage. New
it(...internal#212)block covers BOTH bucketpaths:
"Agent error: boom"exercises theagent error || exceptionbranch (line 41 site, post-image 38-44), and
"some completely novel error..."exercises the unrecognised-detail fallback (line 53 site,post-image 57-62). Both positive (matches
/Activity tab/) and negative(does NOT match
/container logs/or/workspace logs/) assertions arepresent. The pre-existing fallback test was updated in lockstep. Two
bucket paths × two assertion polarities = 4 pins — regression class is
locked.
Backwards compat. Grepped the repo: literal
"Check the workspace logs"only lives ina2aErrorHint.ts+ its test (now both flipped).Other "workspace logs" hits are either descriptive comments referencing
the closed #212 (
ChatErrorBanner.tsx:7,20-21,ChatTab.tsx:601-602,WorkspaceNode.tsx:368) or docs referring to the CLI commandmolecule workspace logs(different surface). No external/support-runbookreferences found in-repo.
Risk. Effectively zero — pure user-facing string + test. No public
API, no schema, no runtime behaviour change.
Scope. Diff is 2 files / +25/-3, no opportunistic refactors,
comments justify each edit with the #212 reference.
Closes #212 cleanly.
core-devops five-axis lens (PR#1617 closeout internal#212)
Verdict: APPROVE. Surgical string flip with mirrored test pin; no
CI/infra risk.
CI. Required-status context on main is
CI / all-required (pull_request)(single context). No lint rule gates on these strings —canvas uses
next lint(no.eslintrc*/biome.jsonshipped) andvitest run. The PR's own newinternal#212test pin IS theCI-enforced regression guard (vitest fails CI if
Activity tabregressesto
container logs/workspace logs). That's the right mechanism;nothing else needed at this scope.
Observability. Tenant/workspace scoping is implicit via the UI —
SidePanel.tsx:300renders<ActivityTab key={selectedNodeId} workspaceId={selectedNodeId} />, so when the user follows "Open theActivity tab" they land on rows already filtered to the workspace whose
chat surfaced the hint. No placeholder needed in the copy. No
finding here.
Tiny-PR rule. Diff is +25/-3 across 2 files (the source string +
its test). No opportunistic refactors, no import churn, no unrelated
adjacent edits. Comments cite
internal#212so the next reader knowswhy. Truly surgical.
Backwards compat / docs. Repo grep for
"workspace logs"/"container logs": the only LITERAL"Check the workspace logs"copy lives in
a2aErrorHint.ts+ its test (both flipped here). Otherhits are either (a) descriptive comments referencing the closed bug
(
ChatErrorBanner.tsx:7,20-21,ChatTab.tsx:601-602,WorkspaceNode.tsx:368), or (b) docs referring to the CLI commandmolecule workspace logs ...— a different surface, intentionallyunchanged.
Follow-up (non-blocking). A repo-wide CI lint that forbids the
strings
"container logs"/"workspace logs"inside thecanvas/src/**UI-copy paths (excluding comments + JSDoc) would hardenthe regression class beyond just
a2aErrorHint.ts. Out of scope here —suggest filing as a sweep follow-up (tier-2 lint, sibling of internal
#95-class hard-gates). Not a blocker.
Approved.
/sop-tier-recheck
(Auto-relay — qa-review + security-review approved statuses failure-state despite 2-distinct-persona APPROVED reviews 5135 + 5136. Per feedback_molecule_core_qa_review_team_required, re-promoting now.)
/sop-tier-recheck
/qa-recheck
/security-recheck