Rituals: lens guardrails (what users can and can't change about a view) #189

Closed
opened 2026-10-04 20:33:59 +00:00 by peterswimm · 6 comments
Owner

Part of #177.

What it's for: people can replace the house-style view of a wish, parlay or run with their own version, called a lens. Lenses are stored per person (actor:<id>, user provenance) and could later be shared through the federation. This issue sets the limits.

Questions for you

  1. What's sealed? The proposal is consent gates, safety ceremonies and overrides, tier locks, the lineage proof line, and destructive-action confirmations. A lens can restyle these but can't remove or hide them. Anything else?
  2. How far can a theme go? A lens may remap colour, type and density tokens, but the existing contrast tests still apply. Should anything else be locked, such as minimum text size or focus rings?
  3. What does editing a lens look like? Options are a "customise this view" mode on a view, a separate editor, or importing someone's shared lens. Plus "reset to house style".
  4. How does someone know they're on a lens? A small indicator, so a bug report or screenshot isn't confused with the house style.

Acceptance criteria

  • Sealed list ratified. Engineering will enforce it in the block spec validator. Ratified (#177): the proposed baseline stands and is extensible.
  • Token-override limits. Decided (final, 2026-10-13).
  • Lens editing and reset flow, and the "you're on a lens" indicator. Decided (final, 2026-10-13).
Part of #177. **What it's for:** people can replace the house-style view of a wish, parlay or run with their own version, called a **lens**. Lenses are stored per person (`actor:<id>`, `user` provenance) and could later be shared through the federation. This issue sets the limits. ## Questions for you 1. **What's sealed?** The proposal is consent gates, safety ceremonies and overrides, tier locks, the lineage proof line, and destructive-action confirmations. A lens can restyle these but can't remove or hide them. Anything else? 2. **How far can a theme go?** A lens may remap colour, type and density tokens, but the existing contrast tests still apply. Should anything else be locked, such as minimum text size or focus rings? 3. **What does editing a lens look like?** Options are a "customise this view" mode on a view, a separate editor, or importing someone's shared lens. Plus "reset to house style". 4. **How does someone know they're on a lens?** A small indicator, so a bug report or screenshot isn't confused with the house style. ## Acceptance criteria - [x] Sealed list ratified. Engineering will enforce it in the block spec validator. **Ratified ([#177](https://git.toilville.dev/Toilville/toilville-design/issues/177#issuecomment-26060)): the proposed baseline stands and is extensible.** - [x] Token-override limits. **Decided ([final, 2026-10-13](https://git.toilville.dev/Toilville/toilville-design/issues/189#issuecomment-30142)).** - [x] Lens editing and reset flow, and the "you're on a lens" indicator. **Decided ([final, 2026-10-13](https://git.toilville.dev/Toilville/toilville-design/issues/189#issuecomment-30142)).**
Author
Owner

@ville your framework reply on #177 answers part of this issue. I've ticked the sealed-list criterion.

Settled:

  • Q1, sealed: the proposed baseline stands (consent gates, safety ceremonies and overrides, tier locks, lineage proof, destructive-action confirmations). It's extensible: if the Wish, Parlay or Run work shows another element a lens must not hide or weaken, it gets added here.
  • Q2, how far a theme can go (mostly): a lens moves Personality dials, not raw tokens. Accent comes from the validated palette only, and warning, error and consent colours keep their meaning. Density, corner softness, motion energy and atmosphere are each bounded. Minimum text and target sizes, focus order and OS reduced motion belong to Grammar, so no lens can override them.
  • Q3, resets: there are two, back to the mode defaults and back to the house style.

Still open here:

  • The actual clamp values for each dial. This is what closes the "Token-override limits" criterion.
  • The lens editing flow (Q3): a customise mode, a separate editor, or importing someone else's lens.
  • The "you're on a lens" indicator (Q4).
@ville your [framework reply on #177](https://git.toilville.dev/Toilville/toilville-design/issues/177#issuecomment-26060) answers part of this issue. I've ticked the sealed-list criterion. **Settled:** - **Q1, sealed:** the proposed baseline stands (consent gates, safety ceremonies and overrides, tier locks, lineage proof, destructive-action confirmations). It's extensible: if the Wish, Parlay or Run work shows another element a lens must not hide or weaken, it gets added here. - **Q2, how far a theme can go (mostly):** a lens moves Personality dials, not raw tokens. Accent comes from the validated palette only, and warning, error and consent colours keep their meaning. Density, corner softness, motion energy and atmosphere are each bounded. Minimum text and target sizes, focus order and OS reduced motion belong to Grammar, so no lens can override them. - **Q3, resets:** there are two, back to the mode defaults and back to the house style. **Still open here:** - The actual clamp values for each dial. This is what closes the "Token-override limits" criterion. - The lens editing flow (Q3): a customise mode, a separate editor, or importing someone else's lens. - The "you're on a lens" indicator (Q4).
Author
Owner

@ville, here's a proposal for the parts of this issue that are still open, so you have something concrete to mark up. Every step below is an existing UDG token, so a control moves along a scale you've already designed and never invents a value. Change anything.

1. Limits for each control

Control Steps What each step does What it can never do
Accent Pick from the five mode accents (accentObservatory … accentFederation) Swaps the view's accent role Remap accentConsent, accentWarning, accentError, accentSuccess or accentTrust. Adding an accent to the palette means a new token plus contrast tests in both themes, as today.
Density compact · default · spacious compact is the existing compact flag, moving one step down the space scale (space4 → space3). spacious moves one step up (space4 → space5, space6 → space8). Go below labelSm (12px) for any text or bodySm (14px) for body text, below touchTargetMin (44px) for anything tappable, or below space1 between interactive items. Text size is never a density control.
Corner softness sharp · default · soft sharp makes everything radiusSm (4px). soft moves one step up (radiusSm → radiusMd, radiusMd → radiusLg). Go past radiusLg on a surface. radiusFull stays reserved for pills, chips and avatars.
Motion energy still · default · expressive still makes every transition instant. expressive uses emphasizedDecel/emphasizedAccel for entering and leaving, and turns on the ambient animation phases. Go longer than deliberate (500ms). Speed a ceremony up below deliberate other than all the way to zero. Override OS reduced motion, which always wins.
Atmosphere plain · subtle · ambient plain has no shader or particles. subtle has the shader only. ambient is today's full layer. Sit behind text without a solid surface, or go past today's ambient level. It falls to plain in high-contrast mode and to subtle under reduced motion.

Engineering note on atmosphere: the ambient layer (AmbientLayerState) has no strength setting today. It's driven only by state, mode and tier. The subtle step needs a small addition there, and I'll file it once you're happy with the steps.

2. Mode presets for you to fill in

You said not to infer a mode's personality from its accent, so the only column filled in is the accent each mode already uses. Every other cell is yours.

Mode Accent Density Corners Motion Atmosphere
Observatory accentObservatory ? ? ? ?
Workshop accentWorkshop ? ? ? ?
Pilgrimage accentPilgrimage ? ? ? ?
Sanctum accentSanctum ? ? ? ?
Federation accentFederation ? ? ? ?

3. Editing a lens

Proposal: a Customise this view mode inside the view itself rather than a separate editor, so people change the thing they're looking at.

  • The five controls sit in a panel, and the view previews each change live.
  • People can reorder or hide any block that isn't sealed. A sealed block shows a lock, can't be hidden or moved out of the view, and still takes the control settings like everything else.
  • There are two resets, as you decided: Reset to mode defaults and Reset to house style.
  • Importing someone else's lens waits for federation sharing, so it isn't in the first version.

One question for you: do the control settings belong to the person (one personality across every view in a mode), while block arrangement belongs to each view type (wish row, wish detail and so on)? That's my suggestion. The alternative is everything per view, which is more flexible and much harder to keep coherent.

4. The "you're on a lens" indicator

Proposal: a small Lens: <name> chip in the view's header, using labelSm. Tapping it opens Customise and the two resets.

  • It shows only when a personal lens is active. The house style and a mode's own preset are both "not a lens", so they show no chip.
  • It appears in screenshots on purpose, so a bug report says what was on screen.
  • The CLI prints one header line, lens: <name>. --json leaves that line out, but the payload already carries provenance.

What would close this issue

  1. A yes, or your changes, on the steps and limits in section 1. That closes "Token-override limits".
  2. The preset table filled in. That could also move to its own issue if you'd rather keep this one about guardrails.
  3. Answers on section 3's question and section 4's chip. That closes the last criterion.
@ville, here's a proposal for the parts of this issue that are still open, so you have something concrete to mark up. Every step below is an existing UDG token, so a control moves along a scale you've already designed and never invents a value. Change anything. ## 1. Limits for each control | Control | Steps | What each step does | What it can never do | |---|---|---|---| | **Accent** | Pick from the five mode accents (`accentObservatory` … `accentFederation`) | Swaps the view's accent role | Remap `accentConsent`, `accentWarning`, `accentError`, `accentSuccess` or `accentTrust`. Adding an accent to the palette means a new token plus contrast tests in both themes, as today. | | **Density** | compact · default · spacious | compact is the existing `compact` flag, moving one step down the space scale (`space4` → `space3`). spacious moves one step up (`space4` → `space5`, `space6` → `space8`). | Go below `labelSm` (12px) for any text or `bodySm` (14px) for body text, below `touchTargetMin` (44px) for anything tappable, or below `space1` between interactive items. Text size is never a density control. | | **Corner softness** | sharp · default · soft | sharp makes everything `radiusSm` (4px). soft moves one step up (`radiusSm` → `radiusMd`, `radiusMd` → `radiusLg`). | Go past `radiusLg` on a surface. `radiusFull` stays reserved for pills, chips and avatars. | | **Motion energy** | still · default · expressive | still makes every transition `instant`. expressive uses `emphasizedDecel`/`emphasizedAccel` for entering and leaving, and turns on the ambient animation phases. | Go longer than `deliberate` (500ms). Speed a ceremony up below `deliberate` other than all the way to zero. Override OS reduced motion, which always wins. | | **Atmosphere** | plain · subtle · ambient | plain has no shader or particles. subtle has the shader only. ambient is today's full layer. | Sit behind text without a solid surface, or go past today's ambient level. It falls to plain in high-contrast mode and to subtle under reduced motion. | **Engineering note on atmosphere:** the ambient layer (`AmbientLayerState`) has no strength setting today. It's driven only by state, mode and tier. The subtle step needs a small addition there, and I'll file it once you're happy with the steps. ## 2. Mode presets for you to fill in You said not to infer a mode's personality from its accent, so the only column filled in is the accent each mode already uses. Every other cell is yours. | Mode | Accent | Density | Corners | Motion | Atmosphere | |---|---|---|---|---|---| | Observatory | `accentObservatory` | ? | ? | ? | ? | | Workshop | `accentWorkshop` | ? | ? | ? | ? | | Pilgrimage | `accentPilgrimage` | ? | ? | ? | ? | | Sanctum | `accentSanctum` | ? | ? | ? | ? | | Federation | `accentFederation` | ? | ? | ? | ? | ## 3. Editing a lens **Proposal:** a *Customise this view* mode inside the view itself rather than a separate editor, so people change the thing they're looking at. - The five controls sit in a panel, and the view previews each change live. - People can reorder or hide any block that isn't sealed. A sealed block shows a lock, can't be hidden or moved out of the view, and still takes the control settings like everything else. - There are two resets, as you decided: **Reset to mode defaults** and **Reset to house style**. - Importing someone else's lens waits for federation sharing, so it isn't in the first version. **One question for you:** do the control settings belong to the person (one personality across every view in a mode), while block arrangement belongs to each view type (wish row, wish detail and so on)? That's my suggestion. The alternative is everything per view, which is more flexible and much harder to keep coherent. ## 4. The "you're on a lens" indicator **Proposal:** a small `Lens: <name>` chip in the view's header, using `labelSm`. Tapping it opens Customise and the two resets. - It shows only when a personal lens is active. The house style and a mode's own preset are both "not a lens", so they show no chip. - It appears in screenshots on purpose, so a bug report says what was on screen. - The CLI prints one header line, `lens: <name>`. `--json` leaves that line out, but the payload already carries `provenance`. ## What would close this issue 1. A yes, or your changes, on the steps and limits in section 1. That closes "Token-override limits". 2. The preset table filled in. That could also move to its own issue if you'd rather keep this one about guardrails. 3. Answers on section 3's question and section 4's chip. That closes the last criterion.
Member

Revision to my #177 direction: the ownership model for modes and lenses.

A mode is a capability, access and trust state. It is not a Personality preset. A change in AI or network access does not change Density, Corner softness or general Motion.

Who owns what:

  • Grammar: accessibility, semantics, protected and sealed behaviour.
  • Voice: the Toilville house style.
  • Mode: the access state, shown through its Accent and a bounded Atmosphere.
  • Lens Personality: the person's visual preferences (Density, Corners, approved Motion). They stay the same across modes and views.
  • View customisation: block arrangement and visibility, per view type, within the sealed constraints.

Accent

  • The active mode sets the Accent. It is a state signal.
  • A lens cannot replace it. Observatory never shows the accent of another mode.
  • Warning, error, consent, success and trust colours stay protected.
  • Accent is no longer a Personality control.

Atmosphere

  • The mode sets the baseline. Ambient presence can generally rise as capability and access rise.
  • A lens can lower atmosphere below the baseline. It cannot raise it above the baseline.
  • High contrast and OS reduced motion can lower or remove it further.
  • The mapping of modes to plain, subtle and ambient is open.

Resets (these replace "Reset to mode defaults")

  • Reset personality: restores the person's Personality controls to the house-style defaults. It also removes any atmosphere reduction.
  • Reset view: restores block arrangement and visibility to the house-style view.

Unchanged:

  • "Customise this view" inside the view for v1. No separate editor.
  • Importing shared lenses waits for federation sharing.
  • A small Lens: <name> chip in the view header, only when a personal lens is active. It never shows for the house style or a normal mode state. It opens Customise and the resets.
  • The CLI prints lens: <name>. --json relies on provenance.
  • The sealed baseline and its extensibility stand.

Open: the exact limits for Density, Corners, Motion and Atmosphere, and the Atmosphere baseline for each mode. The mode preset table in the proposal is withdrawn.

@peterswimm

Revision to my #177 direction: the ownership model for modes and lenses. A mode is a capability, access and trust state. It is not a Personality preset. A change in AI or network access does not change Density, Corner softness or general Motion. Who owns what: - Grammar: accessibility, semantics, protected and sealed behaviour. - Voice: the Toilville house style. - Mode: the access state, shown through its Accent and a bounded Atmosphere. - Lens Personality: the person's visual preferences (Density, Corners, approved Motion). They stay the same across modes and views. - View customisation: block arrangement and visibility, per view type, within the sealed constraints. Accent - The active mode sets the Accent. It is a state signal. - A lens cannot replace it. Observatory never shows the accent of another mode. - Warning, error, consent, success and trust colours stay protected. - Accent is no longer a Personality control. Atmosphere - The mode sets the baseline. Ambient presence can generally rise as capability and access rise. - A lens can lower atmosphere below the baseline. It cannot raise it above the baseline. - High contrast and OS reduced motion can lower or remove it further. - The mapping of modes to plain, subtle and ambient is open. Resets (these replace "Reset to mode defaults") - Reset personality: restores the person's Personality controls to the house-style defaults. It also removes any atmosphere reduction. - Reset view: restores block arrangement and visibility to the house-style view. Unchanged: - "Customise this view" inside the view for v1. No separate editor. - Importing shared lenses waits for federation sharing. - A small `Lens: <name>` chip in the view header, only when a personal lens is active. It never shows for the house style or a normal mode state. It opens Customise and the resets. - The CLI prints `lens: <name>`. `--json` relies on `provenance`. - The sealed baseline and its extensibility stand. Open: the exact limits for Density, Corners, Motion and Atmosphere, and the Atmosphere baseline for each mode. The mode preset table in the proposal is withdrawn. @peterswimm
Member

Limits for the Personality controls and the Atmosphere baselines. This closes "Token-override limits".

Density (lens): compact · default · spacious = space3 12 · space4 16 · space5 20.
Text never gets smaller. The floors in the proposal stand: 12 px label text, 14 px body text, 44 px targets, and at least space1 between interactive items.

Corners (lens): sharp · default · soft.

  • sharp: every surface 0. This needs a new token, radiusNone.
  • default: card 8, button 4, input 4 (radiusMd, radiusSm, radiusSm).
  • soft: card, button and input at 20. This needs a new radius token at 20.
  • Chips, pills and avatars stay radiusFull.
  • This replaces the rule "nothing goes past radiusLg".

Motion (lens): still · default · expressive.

  • still: every transition is instant.
  • default: today's behaviour.
  • expressive: entering uses a new easing, (0.16, 1, 0.3, 1), with a matching leaving curve. Durations stay as in default or longer, up to deliberate (500 ms).
  • No transition goes over 500 ms. A ceremony never runs faster than deliberate, except at zero. OS reduced motion always wins.

Atmosphere: three semantic levels, plain · subtle · ambient.

  • plain: no atmospheric treatment. subtle: a restrained treatment. ambient: a clearly stronger treatment.
  • The levels are not tied to today's shader or particles. The current particle treatment is not the final ambient look. The visual design comes later and does not change the three levels.
  • The mode sets the baseline. The level rises where the data boundary changes, and more atmosphere is not a reward for more access:
    • Observatory: plain
    • Workshop: plain
    • Pilgrimage: subtle
    • Sanctum: ambient
    • Federation: ambient
  • Accent stays the primary mode signal. Atmosphere is a secondary cue.
  • A lens can lower atmosphere by any number of steps. It cannot raise it above the baseline.
  • High contrast and OS reduced motion can lower or remove it further.

Engineering follow-up: radiusNone, a radius token at 20, the new easing token, and a baseline per mode in every view (today atmosphere shows only on the splash and mode-selection screens).
@peterswimm

Limits for the Personality controls and the Atmosphere baselines. This closes "Token-override limits". Density (lens): compact · default · spacious = space3 12 · space4 16 · space5 20. Text never gets smaller. The floors in the proposal stand: 12 px label text, 14 px body text, 44 px targets, and at least space1 between interactive items. Corners (lens): sharp · default · soft. - sharp: every surface 0. This needs a new token, radiusNone. - default: card 8, button 4, input 4 (radiusMd, radiusSm, radiusSm). - soft: card, button and input at 20. This needs a new radius token at 20. - Chips, pills and avatars stay radiusFull. - This replaces the rule "nothing goes past radiusLg". Motion (lens): still · default · expressive. - still: every transition is instant. - default: today's behaviour. - expressive: entering uses a new easing, (0.16, 1, 0.3, 1), with a matching leaving curve. Durations stay as in default or longer, up to deliberate (500 ms). - No transition goes over 500 ms. A ceremony never runs faster than deliberate, except at zero. OS reduced motion always wins. Atmosphere: three semantic levels, plain · subtle · ambient. - plain: no atmospheric treatment. subtle: a restrained treatment. ambient: a clearly stronger treatment. - The levels are not tied to today's shader or particles. The current particle treatment is not the final ambient look. The visual design comes later and does not change the three levels. - The mode sets the baseline. The level rises where the data boundary changes, and more atmosphere is not a reward for more access: - Observatory: plain - Workshop: plain - Pilgrimage: subtle - Sanctum: ambient - Federation: ambient - Accent stays the primary mode signal. Atmosphere is a secondary cue. - A lens can lower atmosphere by any number of steps. It cannot raise it above the baseline. - High contrast and OS reduced motion can lower or remove it further. Engineering follow-up: radiusNone, a radius token at 20, the new easing token, and a baseline per mode in every view (today atmosphere shows only on the splash and mode-selection screens). @peterswimm
Member

Final decisions for #189. This closes "Token-override limits" and "Lens editing and reset flow, and the indicator". Where it differs from the earlier proposal or from #177, this comment governs.

Ownership

  • Grammar: accessibility, semantics, protected and sealed behaviour. Fixed.
  • Voice: the Toilville house style.
  • Mode: a capability, access and trust state. It owns Accent and the Atmosphere baseline. It is not a Personality preset.
  • Lens Personality: Density, Corners, Motion and Atmosphere (lower only). The settings belong to the person and stay the same across modes and views.
  • View customisation: block arrangement and visibility, per view type, within the sealed constraints.

Accent

  • The active mode sets it. A lens cannot replace it. Warning, error, consent, success and trust colours stay protected. Accent is not a lens control.

Density

  • The rhythm tokens space3 to space6 step with Density. Anchor space4: compact space3 (12), default space4 (16), spacious space5 (20).
  • space1, space2 and space8 stay fixed, so chips, buttons and small gaps keep their size.
  • Text sizes do not change. touchTargetMin and the interactive-spacing minimums stay Grammar.
  • Breakpoint compact and surface compact are separate concepts. This issue defines only the lens spacing control.

Corners

  • sharp: 0 on every surface (new token radiusNone).
  • default: card 8, button 4, input 4.
  • soft: card, button and input 20 (new radius token).
  • radiusFull stays for chips, pills and avatars. This replaces "nothing goes past radiusLg".

Motion

  • still: every transition is instant. default: today's behaviour.
  • expressive: entering uses (0.16, 1, 0.3, 1). Leaving uses the mirrored curve (0.7, 0, 0.84, 0). They are a token pair.
  • Durations use the existing duration tokens. No transition goes over deliberate (500 ms).
  • A ceremony is never faster than deliberate, entering or leaving. OS Reduced Motion always wins and may reduce motion to zero.
  • Motion does not enable atmosphere. Motion and Atmosphere are separate.

Atmosphere

  • Three semantic levels: plain, subtle, ambient. No fourth level and no shader-strength control.
  • The levels are not tied to today's shader or particles. The current particle look is not ratified. The visual design comes later.
  • Atmosphere never sits behind text without a solid surface. This is Grammar.
  • The mode sets the baseline: Observatory plain, Workshop plain, Pilgrimage subtle, Sanctum ambient, Federation ambient. Sanctum and Federation share ambient on purpose.
  • A lens can lower atmosphere by any number of steps. It cannot go above the baseline.
  • Reduced Motion keeps the level and removes atmospheric animation (subtle is static, ambient has no motion). High Contrast reduces atmosphere to plain.
  • Accent is the primary mode cue. Atmosphere is a secondary cue. Ceremony atmosphere follows the level.

Editing, resets, indicator

  • "Customise this view" opens inline as a panel with live preview. No separate editor in v1. Importing shared lenses waits for federation sharing.
  • Non-sealed blocks can be reordered or hidden. This is never drag-only. Keyboard and screen-reader users get an equivalent. This is Grammar.
  • Sealed blocks show the word "Sealed", not a lock icon, because the lock already means tier access. They cannot be hidden. They cannot move outside the positions their own Grammar allows.
  • The sealed baseline stands: consent gates, safety ceremonies and overrides, tier locks, lineage proof, destructive-action confirmations. It is extensible.
  • Reset personality: restores the Personality controls to the house-style defaults and removes any atmosphere reduction.
  • Reset view: restores block arrangement and visibility to the house style.
  • A Lens: <name> chip in the view header, only when a personal lens is active. It opens Customise and the resets. The CLI prints lens: <name>. --json relies on provenance.

Superseded: the mode preset table; the Accent control; "ambient is today's full layer"; "falls to subtle under reduced motion"; "expressive turns on the ambient animation phases"; emphasizedDecel and emphasizedAccel for expressive; "a sealed block shows a lock"; "Reset to mode defaults"; "one personality across every view in a mode"; the earlier corner rules; and the earlier note that "text never gets smaller".

Implementation/follow-up work does not block this design decision: save/discard and naming flow, narrow-width panel layout, CLI/voice editing, required token additions, applying mode baselines in views, and the final ambient visual treatment.

@peterswimm

Final decisions for #189. This closes "Token-override limits" and "Lens editing and reset flow, and the indicator". Where it differs from the earlier proposal or from #177, this comment governs. Ownership - Grammar: accessibility, semantics, protected and sealed behaviour. Fixed. - Voice: the Toilville house style. - Mode: a capability, access and trust state. It owns Accent and the Atmosphere baseline. It is not a Personality preset. - Lens Personality: Density, Corners, Motion and Atmosphere (lower only). The settings belong to the person and stay the same across modes and views. - View customisation: block arrangement and visibility, per view type, within the sealed constraints. Accent - The active mode sets it. A lens cannot replace it. Warning, error, consent, success and trust colours stay protected. Accent is not a lens control. Density - The rhythm tokens space3 to space6 step with Density. Anchor space4: compact space3 (12), default space4 (16), spacious space5 (20). - space1, space2 and space8 stay fixed, so chips, buttons and small gaps keep their size. - Text sizes do not change. touchTargetMin and the interactive-spacing minimums stay Grammar. - Breakpoint compact and surface compact are separate concepts. This issue defines only the lens spacing control. Corners - sharp: 0 on every surface (new token radiusNone). - default: card 8, button 4, input 4. - soft: card, button and input 20 (new radius token). - radiusFull stays for chips, pills and avatars. This replaces "nothing goes past radiusLg". Motion - still: every transition is instant. default: today's behaviour. - expressive: entering uses (0.16, 1, 0.3, 1). Leaving uses the mirrored curve (0.7, 0, 0.84, 0). They are a token pair. - Durations use the existing duration tokens. No transition goes over deliberate (500 ms). - A ceremony is never faster than deliberate, entering or leaving. OS Reduced Motion always wins and may reduce motion to zero. - Motion does not enable atmosphere. Motion and Atmosphere are separate. Atmosphere - Three semantic levels: plain, subtle, ambient. No fourth level and no shader-strength control. - The levels are not tied to today's shader or particles. The current particle look is not ratified. The visual design comes later. - Atmosphere never sits behind text without a solid surface. This is Grammar. - The mode sets the baseline: Observatory plain, Workshop plain, Pilgrimage subtle, Sanctum ambient, Federation ambient. Sanctum and Federation share ambient on purpose. - A lens can lower atmosphere by any number of steps. It cannot go above the baseline. - Reduced Motion keeps the level and removes atmospheric animation (subtle is static, ambient has no motion). High Contrast reduces atmosphere to plain. - Accent is the primary mode cue. Atmosphere is a secondary cue. Ceremony atmosphere follows the level. Editing, resets, indicator - "Customise this view" opens inline as a panel with live preview. No separate editor in v1. Importing shared lenses waits for federation sharing. - Non-sealed blocks can be reordered or hidden. This is never drag-only. Keyboard and screen-reader users get an equivalent. This is Grammar. - Sealed blocks show the word "Sealed", not a lock icon, because the lock already means tier access. They cannot be hidden. They cannot move outside the positions their own Grammar allows. - The sealed baseline stands: consent gates, safety ceremonies and overrides, tier locks, lineage proof, destructive-action confirmations. It is extensible. - Reset personality: restores the Personality controls to the house-style defaults and removes any atmosphere reduction. - Reset view: restores block arrangement and visibility to the house style. - A `Lens: <name>` chip in the view header, only when a personal lens is active. It opens Customise and the resets. The CLI prints `lens: <name>`. `--json` relies on `provenance`. Superseded: the mode preset table; the Accent control; "ambient is today's full layer"; "falls to subtle under reduced motion"; "expressive turns on the ambient animation phases"; emphasizedDecel and emphasizedAccel for expressive; "a sealed block shows a lock"; "Reset to mode defaults"; "one personality across every view in a mode"; the earlier corner rules; and the earlier note that "text never gets smaller". Implementation/follow-up work does not block this design decision: save/discard and naming flow, narrow-width panel layout, CLI/voice editing, required token additions, applying mode baselines in views, and the final ambient visual treatment. @peterswimm
Author
Owner

Thanks, this is everything. I've ticked both remaining criteria against your final comment. The follow-up work you listed is filed: toilville/toilville_rituals#542 covers radiusNone, the 20 radius token (the name is yours to pick in the DTCG), the expressive easing pair, the Density rhythm and the per-mode Atmosphere baselines. The lens editor (Customise panel, resets, chip) stays with toilville/toilville_rituals#496, which now matches the ownership model. Closing.

Thanks, this is everything. I've ticked both remaining criteria against your final comment. The follow-up work you listed is filed: toilville/toilville_rituals#542 covers radiusNone, the 20 radius token (the name is yours to pick in the DTCG), the expressive easing pair, the Density rhythm and the per-mode Atmosphere baselines. The lens editor (Customise panel, resets, chip) stays with toilville/toilville_rituals#496, which now matches the ownership model. Closing.
Sign in to join this conversation.
No description provided.