Smooth Card Motion
Activity Cards In Motion
The terminal monitor learned to animate new feed cards without changing the feed model.
0 milestones 3 tasks
2 plan 2 execute 3 review
27m 57s total 9m 34s per task
This run made card motion a rendering concern rather than a new state model. Its decomposition starts with a shared clock and reduced-motion switch, then adds color materialization for live cards, then lets the tail-following feed slide visually while the logical scroll position remains correct. The surviving code shows that the work was not just decorative. The TUI still resolves motion at startup, drives redraw cadence from active animation, treats replayed backlog events differently from live events, and renders half-row slide offsets over the existing feed.
How this walkthrough is structured
Feature
What did the run build and ship?
Current TUI code still carries a startup motion mode, materialized card colors, live-only append state, and half-row tail slide rendering backed by focused coverage.
Build
How did Gantry structure the work?
The run kept terminal motion as layered rendering work, first proving the clock, then color materialization, then tail-follow position changes with clean gates at every boundary.
Motion Clock Setup
1 agents 6m 52s wall time
The timing layer still stands in `src/tui/animation.rs`. It owns easing, clamped progress, animation spans, the motion mode parser, and the redraw interval choice between idle and active motion. The live event loop feeds that mode into the TUI session and polls using the clock's interval, so animation can raise cadence only while there is motion to draw.
This first sprint was asked to provide the timing surface before any visible card behavior depended on it. A fresh agent could hold the work because the brief kept it to pure timing, easing, cadence selection, and a startup motion preference. The boundary was intentionally quiet: the feed should render as before, while later sprints gained a clock they could call. The sprint stayed green, so the first contract was established without a repair pass.
Card Fade In
2 agents 9m 34s wall time
The tree still has the materialization path, though the contribution is mixed with later TUI rewrites. Cards carry optional animation spans, rendering interpolates foreground and background colors from the feed background, and replayed events suppress materialization so old history does not animate on attach or replay. The same distinction also became useful for later slide behavior, which means the sprint's live-versus-replayed boundary survived beyond the fade itself.
This sprint carried the first visible effect while keeping geometry out of scope. The brief made fade a color-only materialization over the clock from the prior sprint, with existing backlog and reduced-motion paths required to stay instant. Its recorded commit touched more than the visual surface because replayed events needed to be distinguishable from live ones, but the cut still held and the gate did not send it back.
Tail Slide Motion
2 agents 14m 5s wall time
The current feed renderer still prepares a tail slide after it knows real card heights, clamps the logical scroll immediately, and then paints with a transient half-row offset. `SlideOffset` and quantization live with the shared animation primitives, while `AppState` cancels or refuses slide state for replay, reduced motion, and manual navigation. The snapshot slide path remains as an observable way to exercise a live card fading while the tail moves.
The final sprint was the higher-risk piece because it added position motion after timing and color had already landed. Its brief kept the logical scroll model authoritative and made the slide a short-lived visual offset, limited to tail-following live appends. That gave the agent a narrow testable target: compose with fade, respect reduced motion, avoid surprise movement after manual scroll, and handle terminal row constraints. The sprint finished green with no recorded recovery.