Skip to content

feat(agent): breathe the working dot in 16 eased steps instead of 4 colours - #673

Merged
DerekMarshall merged 1 commit into
mainfrom
feat/smooth-working-pulse
Oct 14, 2026
Merged

DerekMarshall merged 1 commit into
mainfrom
feat/smooth-working-pulse

Conversation

@DerekMarshall

Copy link
Copy Markdown
Member

The working dot's colour breath, smoothed. Before, it walked a 6-phase ping-pong over the four spice-heat stops at 4 Hz, so each frame jumped up to 51 in a channel, and the dot read as cycling rather than breathing.

Change

  • An eased breath. The dot breathes along the same pepper red → ember → orange → spark ramp on a cosine: 16 frames to a breath at 10 Hz (1.6 s, about the old cycle's length). No frame moves a channel more than 30, and the steps shrink toward either end, so the turns ease instead of bouncing. Half a breath:
    #E03222 → #E23720 → #E9471B → #F35E13 → #FA7C12 → #FF9815 → #FFAF26 → #FFBF32 → #FFC436
  • Still const and pure. The maths is integer, with the cosine tabulated in BREATH_COSINE, so spicy_pulse_color stays const and the draw stays pure.
  • 256-colour terminals breathe too. They used to alternate Red/LightYellow, a blink. They now get the same RGB breath, which the frame's downgrade_buffer quantizes into a stepped warm ramp.
  • Unchanged: mono, per-tab phase offsets, and the 0 fps idle invariant. AgentAnim is still armed only while an agent works.

Cost: 10 redraws a second instead of 4 while any agent works. Only the dot's cell changes, so the terminal sees a few bytes per frame.

Tests

Five new, in render::chrome:

  • smoothness: every frame step is ≤ 30, including the wrap;
  • easing: the step at a turn is under half the step mid-breath;
  • range: pepper red to spark exactly, periodic and symmetric;
  • the table is the cosine;
  • a 256-colour terminal shows at least 4 distinct indices, checked through the dot itself.

Five mutations, each failing its test:

  • the old 6-phase walk;
  • a linear (un-eased) breath — the first version of the easing test missed it, so it was tightened;
  • dropping the blend;
  • a table value off by one;
  • restoring the two-hue fallback.

make check-ci: === GATE: PASS ===, 3,197 library tests.

Generated with Claude Code

…olours

The working dot walked a 6-phase ping-pong over the four spice-heat
stops at 4 Hz, so each frame jumped up to 51 in a channel and the dot
read as cycling rather than breathing.

It now breathes along the same pepper red → ember → orange → spark ramp
on a cosine, 16 frames to a breath at 10 Hz (1.6 s, about the old
cycle's length). No frame moves a channel more than 30, and the steps
shrink toward either end so the turns ease instead of bouncing. The
maths is integer and tabulated (`BREATH_COSINE`), so it stays `const`
and the draw stays pure.

A 256-colour terminal used to alternate two ANSI hues, a blink; it now
gets the same RGB breath, which the frame's downgrade quantizes into a
stepped warm ramp. Mono is unchanged. The animation still runs only
while an agent works, so an idle pane set draws nothing.

Co-Authored-By: Claude <noreply@anthropic.com>
@DerekMarshall
DerekMarshall merged commit f8a758e into main Oct 14, 2026
4 checks passed
@DerekMarshall
DerekMarshall deleted the feat/smooth-working-pulse branch October 14, 2026 11:00
DerekMarshall added a commit that referenced this pull request Oct 15, 2026
Sets the version to `2.2.0-rc.3`, made with `make release-prep
VERSION=2.2.0-rc.3`. Only `Cargo.toml` and `Cargo.lock` change. As with
the earlier rcs, an rc gets no CHANGELOG section, because the 2.2.0
section covers the whole cycle.

## Why another rc

Five changes merged after the rc.2 release run (`v2.2.0-rc.2` was
published 2026-10-14 07:40 UTC). Cutting 2.2.0 from `main` now would
ship them without a soak:

| PR | Change | Why it should soak |
|---|---|---|
| #670 / #671 | fix(agent-status): a `waiting` reported mid-turn is held
until the turn ends | Changes how the activity dot ranks its sources
against each other |
| #672 | fix(codex): a visible async question earns the red attention
dot | Matches what codex draws on screen, verified against codex
0.162.1's default UI |
| #673 | feat(agent): the working dot breathes in 16 eased steps at 10
Hz | Visual. A working agent's dot now redraws at 10 Hz instead of 4 Hz.
Idle is unchanged. |
| #674 | feat(agent-hud): native strip for Antigravity (agy) tabs | A
new reader over agy's transcript format |

Every open bug issue predates July and none is a regression, so rc.3 is
`main` as it stands.

`main` stays at `2.2.0-rc.3` through the soak, which runs into next
week.

**After merge, on `main`:**
1. `make release-tag VERSION=2.2.0-rc.3`
2. Push the tag. `release.yml` verifies the archives reproduce,
publishes a GitHub pre-release, and dispatches the Homebrew tap and apt.
The crates job publishes `spyc 2.2.0-rc.3` and skips `spyc-vt-sys
0.1.0`, which is unchanged.

**Checks:** `make check` passes (the pre-commit gate), and the binary
reports `spyc 2.2.0-rc.3 (<sha>)`.

Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant