Speed1×
Slow motion multiplier
Reduced motion
Show
Plan & open questions
9 open questionsSequence
Each stage lists what blocks it. A stage whose gate is still open does not start early; it starts twice.0. Spike
1 week1. Prototype layer exit on Tooltip and Popover only — the two ends of the frequency range.2. Test @starting-style, transition-behavior: allow-discrete, and top-layer retention in the browsers Astryx supports.3. Define the dismissal state machine: what happens to focus return, outside-press and escape while an element is still leaving.4. Prototype press feedback on the independent scale property, on Button.
unblockedNothing blocks this. It is the only stage that can start today.
1. Foundation
Sequenced in four steps, in this order1. Semantic tokens as pure ALIASES onto the existing primitives — nothing shifts perceptually, so this lands with no visual review.2. Motion lint in warn mode, so the real violation list is the linter’s rather than a script’s.3. The token sweep: every hardcoded value becomes a token, still with no perceptual change.4. Lint to error. Only then retune the values, as a separate change with its own visual review.
gateSprings theme-tunable or not: adding them to the theme contract later is a breaking change.
gateWhat --duration-instant is: 0s or 0.01ms. Ten of the measured sites are 0.01s escapes that exist to keep transitionend firing.
2. Presence
The largest single change1. Shared presence primitive; useLayer awaits its exit rather than hiding synchronously.2. Eleven layer components inherit it from one change.3. Dialog, AlertDialog and CommandPalette, plus the backdrop transition the scrim has never had.4. The input-during-exit rule, written into the primitive’s contract.
gateStage 0’s dismissal state machine.
gateThe exit-optional reversal: the published page currently permits the hard cut, so the paragraph rewrite ships in this stack, not in Docs.
3. Rubric
Publication plus four automated checks1. Publish the criteria beside the accessibility checklist.2. Wire criteria 3, 5, 10 and 12 — the mechanical ones — into CI.3. Score every core component and track the results as a readiness gate.
gateWhere the rubric lives: wiki or published docs.
gateA grandfathering policy, or the rubric blocks unrelated work on day one.
gateThe published-page rewrite: a rubric cannot fail a component for following the docs.
4. Coverage
Many small changes, individually revertible1. Sliding indicators for TabList and SegmentedControl.2. Converge the nine disclosure surfaces onto one technique.3. SideNav rail collapse; the ADD rows: chips, skeleton swap, Banner, Lightbox, EmptyState.
gateDisclosure: grid tracks or height interpolation.
gateThe presence primitive, for anything with an enter and an exit.
5. Docs
Continuous, not a phase1. Per-component motion specs and the property-level rules that live only on the wiki.2. The library compatibility guide and its conformance test.3. An owner and a trigger to revisit, since four months of drift is the status quo this has to break.
gateEvery decision above — except the two reversal paragraphs, which ship with their code rather than waiting for this stage.
Scope discipline
Open questions
Each one names what it needs, what it blocks, and where in the lab you can look at it instead of arguing about it.Should Astryx adopt an asChild-style composition prop?can run late
NeedsA design review at house level. Astryx has deliberately refused polymorphism, and a render-prop shape may fit the conventions better than asChild.
BlocksMotion blocker 3, and equally router links and drag-and-drop. It should not be decided on motion’s evidence alone.
Should springs be theme-tunable?decide first
NeedsA call on whether a theme carries motion personality as well as colour and type.
BlocksThe token work. Adding springs to the theme contract after it ships is a breaking change, so this is decided before Foundation lands even if no theme overrides them at first.
Degrade or delete under reduced motion?decide before the sweep
NeedsA designer and an accessibility sign-off. Note that delete is not the status quo by accident — it is what the published page instructs, so degrading is a policy change.
BlocksThe 36-file sweep, which writes whichever branch is chosen 36 times, and the reduced-motion hook, which has to return a policy rather than a boolean.
How strict is the no-CSS-transition-on-transform rule?decide before publishing
NeedsA prototype of press feedback on the independent scale property. The evidence supports the brief: Button transitions transform at Button/Button.tsx:90 and takes scale(0.98) on :active, so it is exactly the conflict the brief describes.
BlocksRubric criterion 12, and the press token. The middle path costs one property name.
Where does the rubric live?decide before publishing
NeedsA repo-convention call. Wiki keeps the published page clean; it also means reviewers and consumers read different documents, which is part of why the transform-only rule never reached anyone outside the team.
BlocksRubric publication, and whether consumers can self-assess before promotion.
Disclosure: grid tracks or height interpolation?decide before the sweep
NeedsA bake-off verdict. It probably has no single winner — a table row cannot be a grid container — so the honest answer may be one technique with a documented exception.
BlocksConverging nine surfaces, and any new disclosure surface built meanwhile.
Does the slow band get extended, or is ambient motion out of scope?decide before the sweep
NeedsA ruling. The scale stops at 1300ms, so StatusDot at 2s and Chat at 1.5s bypass it entirely; both are in the hardcoded list because of it.
BlocksThose two sites in the sweep, and the definition of --duration-continuous.
Do we need different semantic motion tokens for mobile?decide first
NeedsA decision on the shape, not the values. Recommendation: one shared vocabulary, per-platform values — the same names resolving to different numbers, the way the colour tokens already work. Two vocabularies means two rubrics and two docs pages.
BlocksToken naming, so it is cheap now and expensive after the sweep. Raised in review on the Semantic motion tokens deliverable.
Do we publish default theming values with the tokens?decide before publishing
NeedsA call on what the theme contract exposes. The Collapsible reveal already introduced per-component theme-tunable motion, a sixth theming mechanism no doc describes, so the answer affects more than motion.
BlocksThe docs rewrite, and the springs question above — both are asking what a theme is allowed to retune. Raised in review on Deliverables.
Committed and stretch
Committed is what should be true at the end of H2 whatever else slips: 6 items. Stretch is 5 more that are worth doing and safe to drop, because nothing in the committed list depends on them.| Item | Level | Why |
|---|---|---|
| Semantic tokens as aliases + JS mirror | committed | No perceptual change, so it cannot slip on visual review. |
| Motion lint + the token sweep | committed | Mechanical, and it is what stops the list growing while the rest of the work runs. |
| Layer exit + shared presence primitive | committed | Eleven components from one change. The highest-leverage item in the audit. |
| Dialog, AlertDialog, CommandPalette exit + backdrop | committed | Same primitive, and the scrim hard-cut is the most visible instance. |
| Rewrite of the two reversal paragraphs | committed | Ships with the code it contradicts, or the rubric has no authority. |
| Rubric published + four automated criteria | committed | Criteria 3, 5, 10 and 12 are mechanical; the token linter already exists. |
| Value retune (the six curves, the eight durations) | stretch | Moves every visual-regression baseline. Worth doing, worth doing alone. |
| Sliding indicators, disclosure convergence, SideNav rail | stretch | Each is a real component change with its own review; none blocks anything else. |
| The ADD rows (chips, skeleton swap, Banner, Lightbox, EmptyState) | stretch | Individually small, collectively a quarter. Take them in frequency order. |
| Conformance test in CI for library compatibility | stretch | Needs the guide first, and the guide needs the composition decision. |
| Composition prop | stretch | A house-level design decision that motion should inform, not force. |
Risks
The brief’s six, and what the lab does about each. One of them the lab cannot help with at all, which is worth saying out loud.| Risk | What the lab does about it |
|---|---|
| Retuning easing changes how every existing component feels. | Tokens ship as pure aliases first, so the retune is a separate and revertible change. The lab is where the curves get agreed before that change is written: the rail’s slow-mo reads a 175ms curve at 8x without moving the token. |
| Motion is already fighting the automated gates — two fixes landed this month to stop animation interfering with the a11y audit and the visual-regression capture. | The lab cannot fix this. It is a policy gap: there is no documented rule for what an animated component does under test. Write one alongside the rubric, or the third fix lands the same way. |
| The exit work touches dismissal, which is load-bearing and has its own invariants test. | That is what stage 0 is for. Keeping an element alive through its exit doubles the state matrix for focus return, outside-press and escape, and the spike exists to size that before anyone commits to the quarter. |
| Focus return races the exit: Dialog returns focus to the trigger the moment it closes. | Visible in the lab’s Dialog rig — the focus ring lands on the trigger while the dialog is still on screen, and the page may scroll under it. The presence contract has to say when focus moves, not just when the element goes. |
| The rubric will fail components that ship today. | The bench scores real components, so the grandfathering list is a measured list rather than a promise. Publish it with the rubric. |
| Doc drift is the status quo — the page went four months while a reduced-motion campaign landed underneath it. | The published-page comparison is a diff against the live text, with quotes verbatim so it can be re-run. Make that a check rather than a page, and drift becomes a failure rather than a discovery. |
Defects in the brief itself
Found while building the lab, alongside the measurement corrections on the overview — the sweep is 58 sites rather than 28, and the transform blocker is 34 sites rather than "20+".Deliverables says ten graded criteria; the rubric table has twelve.Criteria 11 (cohesion) and 12 (library compatibility) are the two beyond ten. Twelve is the right number — 12 is the one four-of-which-are-automatable claim depends on — so fix the Deliverables line, not the table.
The timeline has no dates.Five milestones, every Due cell empty. Without dates the sequence above is the only ordering anyone can act on, and "by end of H2" is not a plan for six workstreams.
The team is one person.Team lists a single name for eleven components of presence work, a package-wide token sweep, a rubric, a docs rewrite and a compatibility guide. The decisions above need a designer and an accessibility reviewer who are not currently on it.