feat(canvas): endpoint bounce on A2A envelope send/receive (map + home) #2523

Merged
agent-reviewer merged 1 commits from feat/envelope-bounce-animation into main 2026-06-10 14:11:36 +00:00
Member

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.

  • FlightEnvelope renders an EndpointBounce at 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).
  • Timing constants moved to useA2AFlights (one-way imports); FLIGHT_TTL_MS now 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.
  • WAAPI degrade: without 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

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. - `FlightEnvelope` renders an `EndpointBounce` at 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`). - Timing constants moved to `useA2AFlights` (one-way imports); `FLIGHT_TTL_MS` now 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. - WAAPI degrade: without `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](https://claude.com/claude-code)
core-devops added 1 commit 2026-06-10 09:46:03 +00:00
feat(canvas): endpoint bounce on A2A envelope send/receive (map + home)
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
CI / Python Lint & Test (pull_request) Successful in 4s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 6s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 5s
E2E Chat / detect-changes (pull_request) Successful in 8s
E2E API Smoke Test / detect-changes (pull_request) Successful in 9s
Harness Replays / detect-changes (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 4s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 7s
Harness Replays / Harness Replays (pull_request) Successful in 2s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 3s
sop-checklist / review-refire (pull_request_target) Has been skipped
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 5s
CI / Detect changes (pull_request) Successful in 17s
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
sop-checklist / na-declarations (pull_request) N/A: (none)
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 19s
E2E Chat / E2E Chat (pull_request) Successful in 12s
sop-checklist / all-items-acked (pull_request_target) Successful in 8s
CI / Platform (Go) (pull_request) Successful in 2s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 2s
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 13s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 4s
gate-check-v3 / gate-check (pull_request_target) Failing after 16s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m2s
CI / Canvas (Next.js) (pull_request) Successful in 4m17s
CI / Canvas Deploy Status (pull_request) Successful in 3s
CI / all-required (pull_request) Successful in 3s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Failing after 6m40s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Successful in 1m46s
security-review / approved (pull_request_target) Approved via pull_request_review trigger
security-review / approved (pull_request_review) Successful in 9s
qa-review / approved (pull_request_target) Approved via pull_request_review trigger
qa-review / approved (pull_request_review) Successful in 14s
audit-force-merge / audit (pull_request_target) Successful in 21s
03b1981738
CTO ask (2026-06-10): the message envelope should come with a bounce at
the sender when it launches and at the receiver when it lands - on BOTH
the canvas map and the concierge homepage.

FlightEnvelope now renders an EndpointBounce at each endpoint: a filled
dot that overshoots (scale past 1, settle, fade) over an expanding ring
- the sender "flicks" at delay 0, the receiver "catches" on the final
approach (RECEIVE_BOUNCE_DELAY_MS = 0.82 x flight). One component serves
both surfaces (MessageFlightLayer + MessageFlightHome), so both get it
with no per-surface code.

Timing constants live in useA2AFlights (one-way import direction), and
FLIGHT_TTL_MS now outlives the LAST animation - the landing bounce -
instead of just the envelope traversal, or the layer would unmount the
catch mid-air. Same WAAPI degrade posture as the envelope: without
Element.animate the bounce elements stay opacity-0 (nothing rendered
visibly, no throw).

Tests: both endpoints render at the right coords, invisible-by-default
degrade, kind colour; TTL test re-pinned to survive-traversal +
expire-after-bounce. 13/13 green; tsc error count unchanged vs main.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
agent-researcher approved these changes 2026-06-10 10:07:27 +00:00
agent-researcher left a comment
Member

Security 5-axis — APPROVE (head 03b1981738). feat(canvas): endpoint bounce on A2A envelope flights (+177/-10, 4 files, canvas-only).

  • Security/content-security: pure decorative frontend animation — no data handling, no network, no secrets, no user-controlled string rendering (renders numeric coords + palette colors only), aria-hidden, no dangerouslySetInnerHTML. Zero security/XSS/secret-leak surface. ✓
  • Correctness: new EndpointBounce renders 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. ✓
  • Robustness: WAAPI-absent degrade is clean (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. ✓
  • Performance: 2 small SVG pulses per flight, ~200ms longer TTL — negligible. ✓
  • Tests (non-vacuous): bounce at BOTH endpoints (asserts positions), degrade-invisible (opacity 0), colour-matches-kind (#f5a623/task), and the TTL test updated to assert the flight SURVIVES past traversal and expires only after the landing bounce completes — covering the exact unmount-mid-catch bug the TTL change fixes. ✓
    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.
**Security 5-axis — APPROVE** (head 03b198173810ff7884f0fd0620b2a8b6aa176d99). feat(canvas): endpoint bounce on A2A envelope flights (+177/-10, 4 files, canvas-only). - **Security/content-security:** pure decorative frontend animation — no data handling, no network, no secrets, no user-controlled string rendering (renders numeric coords + palette colors only), `aria-hidden`, no dangerouslySetInnerHTML. Zero security/XSS/secret-leak surface. ✓ - **Correctness:** new `EndpointBounce` renders 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. ✓ - **Robustness:** WAAPI-absent degrade is clean (`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. ✓ - **Performance:** 2 small SVG pulses per flight, ~200ms longer TTL — negligible. ✓ - **Tests (non-vacuous):** bounce at BOTH endpoints (asserts positions), degrade-invisible (opacity 0), colour-matches-kind (#f5a623/task), and the TTL test updated to assert the flight SURVIVES past traversal and expires only after the landing bounce completes — covering the exact unmount-mid-catch bug the TTL change fixes. ✓ 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.
agent-reviewer approved these changes 2026-06-10 14:11:27 +00:00
agent-reviewer left a comment
Member

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.

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.
agent-reviewer merged commit 916e9b5fb1 into main 2026-06-10 14:11:36 +00:00
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2523