# SPEC — Relay Pulse Motion System
*v3.5 · 2026-07-10 · Owner: EC · Ratified*
*Rules unchanged — carried forward verbatim into v3.5 from v3.4.1 (June 10, 2026, Session FYBFRY), where they were ratified.*
*Extends the pulsing easter egg into a defined motion family.*

> **Naming:** "pulse" here is the **motion system** (`--rly-pulse` `#00D9C8`, motion-only).
> It is unrelated to the product feature formerly named Pulse, which is now **Stream**
> (see `_vocab/_VOCAB.md`).

---

## Premise

The pulse is the one living thing in an otherwise flat system. v3.5, like v3.4 before it, bans shadows, gradients, and glows from product UI — which makes motion the only channel for warmth and life. This spec promotes the easter egg from a one-off to the brand's heartbeat, with hard rules so it never becomes noise.

## The colour rule

**#00D9C8 is retired from static use.** It becomes the pulse colour — it may only appear in motion. The mark, Codes, CTAs, and all static elements use system teal (`#0d9488` light / `#2dd4bf` dark). When something glows #00D9C8, it means something is happening *right now*.

This resolves the v3.4 dual-teal exception ("mark-only #00D9C8") cleanly: the legacy teal isn't deleted, it's given a job.

## The family

| # | Moment | Behaviour | Loop? | Where |
|---|---|---|---|---|
| 1 | **Heartbeat** | Core scales 1→1.18, rays shimmer clockwise | Yes, 2.8s | Brand surfaces only: hero, sign-in, empty states |
| 2 | **Receipt flash** | #00D9C8 ring expands from Code container, 0.9s | Once | The moment a relay is received |
| 3 | **Send burst** | Rays fire outward through #00D9C8, settle to teal | Once | The moment a relay is created |
| 4 | **Awaiting** | Core-only slow breathe, 4.2s | Yes | Transfer sent, not yet received |
| 5 | **Arrival ring** | Core dot + one emanating ring | Once | Notifications, toasts |
| 6 | **Broadcast** | Press-and-hold the mark → triple beat + double ripple | Hidden | Easter egg. Keep rare; that's the charm |

## Hard rules

1. One pulsing element per view, maximum.
2. Product UI transitions stay ≤0.18s — pulse moments are event animations (once) or brand-surface loops, never product chrome.
3. Everything disables under `prefers-reduced-motion`. The static mark must carry the brand alone.
4. Never loop #00D9C8 on product surfaces. Looping pulses (heartbeat, awaiting) stay in system teal; #00D9C8 is reserved for event flashes.

## Implementation

`brand/relay-pulse.css` — drop-in, pairs with `brand/relay-mark*.svg` (rm-core / rm-ray class hooks, currentColor).

## Relationship to the eggs gallery (PR #34)

The 11-egg gallery at `creative.relayctx.com/concepts/eggs/` predates this spec and used the constraint "teal #0d9488 only." v3.4.1 amends that constraint: **event-flash eggs** (Receive Beam, Status Snap arrival moments) may use #00D9C8 — they move, they qualify. **Looping eggs** (Idle Pulse) stay #0d9488 per hard rule 4. All other egg constraints (reduced-motion, non-essential, accessible, self-contained, no layout impact) carry into this spec unchanged.

## Existing easter eggs — kept and absorbed

- Auth redirect splash pulse (relay-app `concepts/index.html`, 1.6s `rPulse`) → migrate to `.rly-heartbeat`
- Travelling particles on marketing viz (relay-web v1/v3) → compatible; recolour static #00D9C8 path strokes to system teal, keep particles #00D9C8 (they move — they qualify)
- Code hover border-teal transition → stays as-is (product transition, 0.15s)
