interaction-speed
Use when a user surface feels sluggish, when designing the responsiveness of a new interaction, or when reviewing perceived performance — latency budgets, preloading and caching strategy, optimistic rendering, loading states, notification and interruption policy (toast vs modal), and double-click/double-submit hazards.
- License 许可
- MIT
- 最近更新
- 2026-11-10
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- interaction-speed
- metadata
- { "owner": "tze", "status": "active", "authors": [ "tze", "Claude Fable 5" ], "last_reviewed": "2026-07-03" }
- description
- Use when a user surface feels sluggish, when designing the responsiveness of a new interaction, or when reviewing perceived performance — latency budgets, preloading and caching strategy, optimistic rendering, loading states, notification and interruption policy (toast vs modal), and double-click/double-submit hazards.
02 资源文件 1
- 脚本scripts/check_setup.sh1.5 KB
03 SKILL.md 正文
Interaction Speed
Perceived performance as a design property. The bar: snappy — the UI moves as fast as the user's thought, acknowledges every input instantly, and does its slow work where the user can't feel it.
Use This Skill When
- A flow feels sluggish, or users report clicking things twice
- Designing the responsiveness of a new interaction: what happens in the first 100ms, what's optimistic, what's preloaded
- Reviewing loading states, spinners, skeletons, and cache strategy
- Deciding whether an operation runs synchronously in the UI or in background
Example trigger phrasings: "make this feel faster", "why does this feel sluggish", "users double-click the save button", "should this be optimistic", "what should we preload".
Do Not Use This Skill For
- Diagnosing an actual performance regression to root cause —
/th-engineeringdiagnosis (come back here for how the UI should behave while slow) - Animation duration policy — visual-language
Reviewable Expectations
Latency budgets
Measure input → first visible response, not server time:
| Budget | Requirement |
|---|---|
| < 100ms | Feels instant. Target for all local interactions: typing echo, toggles, menu open, palette filtering. No feedback needed beyond the state change itself. |
| 100–300ms | Acknowledge immediately (pressed state, highlight), complete without progress UI. |
| 300ms–1s | Show lightweight progress (inline skeleton/shimmer), keep the rest of the UI live. |
| > 1s | Run async: UI stays fully usable, progress is visible, completion is announced where the user is now — not where they were. |
A hot-path interaction over budget is a defect regardless of what the backend costs; move the cost off the interaction.
Optimism and caching
- Optimistic rendering by default for mutations that almost always succeed: apply the change locally at once, reconcile in background, and on failure roll back loudly (restore state + explain), never silently. Never optimistic for irreversible or financial effects, actions with non-trivial failure rates, or server-authoritative results the user acts on next (generated IDs, balances, permission checks) — show honest pending state there; a rollback can't unfire a side effect.
- Preload what the user will probably want next: warm caches at idle, prefetch on hover/focus/route-likelihood, precompute the expensive view before it's opened.
- Stale-while-revalidate: render last-known data immediately, refresh in place. A blank screen that could have shown yesterday's data is a defect — except where stale data misleads or is unsafe to act on (balances, prices, permissions): there, block on fresh data or visibly mark the value stale.
- Cache invalidation states its rule (event, TTL, version) — "we'll refetch every time to be safe" is a latency defect wearing a correctness costume.
Input integrity
- Input is never blocked: typing, scrolling, and clicking stay live during background work. A frozen frame is worse than a slow result.
- Repeat-safe controls: the first activation disables, debounces, or dedupes; a double-click must never double-submit, double-charge, or double-navigate. A double-click on a single-action control is also a signal that feedback may have been late — investigate the feedback, don't assume.
- Fast users are honored, not throttled: type-ahead is buffered, an Enter pressed during a load is queued, keystrokes are never dropped while the UI catches up.
- Layout never shifts under a pending click: content that pops in must not move the button the user is aiming at.
- Context survives: navigation, refresh, and failure preserve typed input, selection, scroll position, and filter state. Destroying work-in-progress is a top-severity defect — worse than any latency finding.
Waiting and interruption
- Skeletons over spinners: show the shape of what's coming in place. Global spinners/overlays are a last resort.
- Progress is honest: no fake bars; if duration is unknown, say what's happening. Long-running CLI/TUI operations stream progress as they work; silent buffering until completion is a defect.
- Never make the user re-request: if it failed, offer retry with the input preserved.
- Interrupt (modal, focus-steal) only for decisions that must be made now; everything else is non-blocking and dismissible (toast, banner, badge), and never steals focus mid-task.
- Toasts carrying an action (undo, view) persist ≥5s and pause on hover; pure confirmations may auto-dismiss sooner. This skill owns interruption behavior; announcement semantics for assistive tech belong to accessibility.
Review Method
- Walk the hot paths with the design-bar walkthrough's Pace and Repetition questions (design-bar); time input → visible response where measurable.
- For each interaction over budget: classify the fix — acknowledge sooner, render optimistically, preload earlier, or move work async.
- Grep mutation handlers for missing pending/disabled states and non-idempotent submits; cite file:line.
No built UI yet? Apply the same expectations to the spec's described interactions; evidence cites the spec section or screen region.
04 同仓库更多 Skills
user-run
Use when a step needs privileges this session lacks (docker, sudo, another user's checkout or secrets, host access) and the owner must run it as tze. Writes a reviewable /home/orca/.tmp/<slug>/run.sh that impersonates tze (USER_TO_IMPERSONATE overrides), tees timestamped logs plus latest.log and collects artifacts there; Claude presents it with a risk and time brief, then continues from the logs. Triggers: "I'll run it for you", "permission denied on docker.sock", "needs sudo", "sudo: a password is required", "run as tze", "/user-run".
requesting-code-review
Use when completing tasks, implementing major features, or before merging to verify work meets requirements
receiving-code-review
Use when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires technical rigor and verification, not performative agreement or blind implementation
finishing-a-development-branch
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
executing-plans
Use when you have a written implementation plan to execute in a separate session with review checkpoints
dispatching-parallel-agents
Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies