feat(canvas): endpoint bounce on A2A envelope send/receive (map + home) #2523
Reference in New Issue
Block a user
Delete Branch "feat/envelope-bounce-animation"
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?
CTO ask (2026-06-10): the envelope's sender and receiver should bounce when sending/receiving — on both the canvas map and the concierge homepage.
FlightEnveloperenders anEndpointBounceat each endpoint: overshoot-dot + expanding ring; sender flicks at launch, receiver catches on the final approach (0.82×flight). One component → both surfaces (MessageFlightLayer+MessageFlightHome).useA2AFlights(one-way imports);FLIGHT_TTL_MSnow outlives the landing bounce instead of just the traversal (otherwise the layer unmounts the catch mid-air) — TTL test re-pinned to survive-traversal + expire-after-bounce.Element.animate, bounce elements stay opacity-0 (no throw, nothing visible).13/13 targeted tests green; full components+hooks sweep 1152 passed; tsc error count unchanged vs main.
🤖 Generated with Claude Code
Security 5-axis — APPROVE (head
03b1981738). feat(canvas): endpoint bounce on A2A envelope flights (+177/-10, 4 files, canvas-only).aria-hidden, no dangerouslySetInnerHTML. Zero security/XSS/secret-leak surface. ✓EndpointBouncerenders a WAAPI bounce at launch (delay 0) + landing (delay RECEIVE_BOUNCE_DELAY_MS). Timing constants live in useA2AFlights.ts and are imported by FlightEnvelope.tsx → one-way import, no cycle.FLIGHT_TTL_MS = RECEIVE_BOUNCE_DELAY_MS(984) + BOUNCE_DURATION_MS(420) + 120 = 1524— correctly extended so the flight outlives the LAST animation (the receiver catch); previously 1320 would have unmounted the layer mid-catch. ✓typeof el.animate !== "function"→ renders nothing visible, opacity stays 0); animations cancelled on unmount (anims.forEach(a => a.cancel())); MAX_CONCURRENT=12 cap unchanged so a delegation storm can't spawn unbounded DOM. ✓Required gate GREEN (CI/all-required ✓, E2E-API ✓, Handlers-PG ✓, trusted sop-checklist(pull_request_target) ✓; the failing sop-checklist(pull_request) is the untrusted fork-variant, correctly ignored). Author core-devops ≠ me; 1st of 2 lanes → CR-B qa → merge. Clean — APPROVE.
qa APPROVE (5-axis, 2nd distinct lane — agent-researcher 1st; author≠me). Correctness: feat(canvas) endpoint-bounce — FlightEnvelope.tsx EndpointBounce renders a small bounce pulse at flight endpoints (sender flick on launch + receiver catch), WAAPI Element.animate with the same graceful-degrade posture as the envelope (no Element.animate → static render). Pure visual/animation feature on the A2A message-flight viz. Robustness: degrade-safe; data-testid=flight-endpoint-bounce for testability. Security: NONE relevant — animation only (scale/opacity/transform); zero dangerouslySetInnerHTML/innerHTML/eval/fetch/url-handling. Performance: GPU-composited WAAPI transforms, bounded duration. Readability: clear bounce-mechanism comments. Content-sec: clean (frontend TS). VERIFY-BY-STATE GATE: dedicated REQUIRED gate GREEN — CI/all-required + Platform(Go) + security-review-pt + qa-review-pt + sop-pt all ✓. The 3 reds are advisory-only: Local-Provision-E2E (D2), gate-check-v3 (the SYSTEMIC repo-global failure — now PROVEN non-BP-required, merged-over on the pure-test-file #2494 via probe-200), sop-pr (advisory; sop-pt green). No non-dismissed RC. Approving → 2-distinct-genuine; probe arbitrates the advisory reds.