- commit
- ca0e3e67554a6deb15d987b4391d99fc28b96e6d
- parent
- 32f8f3038fe3380c8a90a134bafdab680be07635
- author
- Dami <dami.etoile@gmail.com>
| A | openspec/ | 2 | ++ |
| A | openspec/ | 29 | ++++++++++++++++++++++ |
| A | openspec/ | 24 | ++++++++++++++++++ |
| A | openspec/ | 40 | ++++++++++++++++++++++++++++++ |
| A | openspec/ | 11 | ++++++++ |
@@ -0,0 +1,29 @@
1+## Context2+3+The board currently infers native-left facing only when no palette entry exists. Basic Proofs, Word Lab, and the FENN example all repeat `MIAU: '🐈'`, so those proofs lose mirroring. The `faces` palette field already states a custom glyph's native horizontal direction. The 🐈 image has no authored up/down view.4+5+## Goals / Non-Goals6+7+**Goals:** Make the native direction explicit for the built-in cat and have successful horizontal movement face that direction on every board surface. Keep mod glyphs predictable and Undo/reset exact.8+9+**Non-Goals:** Rotate the side-profile emoji for vertical motion or infer an arbitrary emoji's native direction from its Unicode name.10+11+## Decisions12+13+- Resolve native direction from the final glyph: 🐈 used for MIAU or CAT is left-facing even when supplied as a plain string. An explicit palette `faces` value takes precedence. A different plain glyph stays non-directional. This fixes bundled content without changing the CommonJS schema.14+- A successful horizontal movement event sets facing to its horizontal direction. A pushed directional actor also faces its actual displacement. If the same actor moves itself later in a turn, its horizontal self direction wins. Vertical movement preserves the last horizontal orientation because the available emoji has no up/down drawing. Blocked intents do not move and do not turn.15+- Retain per-ID visual history for Undo and clear it on level load/reset. Rendering compares that direction with the glyph's declared native direction and mirrors only the emoji bitmap.16+17+## Risks / Trade-offs18+19+- **A platform draws 🐈 with a different native direction** → the glyph declaration can be changed in one place; the movement logic remains the same.20+- **A mod replaces MIAU with a different plain glyph** → it will not flip without an explicit `faces` declaration, avoiding accidental mirroring of front-facing emoji.21+- **Vertical travel lacks a matching emoji view** → preserve the last horizontal pose and send a separate design question if a four-direction visual becomes necessary.22+23+## Migration Plan24+25+Ship as a presentation correction. Existing packs using `MIAU: '🐈'` gain forward-facing movement automatically; saved packs and progress require no migration.26+27+## Open Questions28+29+- Whether the designer wants a separate up/down direction cue for MIAU in a later visual change.@@ -0,0 +1,24 @@
1+## Why2+3+MIAU sometimes appears to walk backward because bundled packs supply the built-in 🐈 as a plain palette string, which currently suppresses its known native facing. The face direction should be defined by the glyph and follow successful horizontal travel consistently across proofs.4+5+## What Changes6+7+- Declare 🐈 as a native-left directional glyph for built-in MIAU, including bundled packs that repeat the same glyph as a plain string.8+- Set horizontal facing from successful displacement, including a push, while preserving it through vertical movement, idle frames, and blocked input.9+- Keep an unrelated mod glyph non-directional unless its palette object declares `faces`.10+- Verify proof, Title, INDEX, Undo, reset, mod palette, and mobile rendering.11+12+## Capabilities13+14+### New Capabilities15+16+None.17+18+### Modified Capabilities19+20+- `game-presentation`: make native MIAU facing and successful travel the authority for horizontal glyph orientation.21+22+## Impact23+24+Canvas glyph orientation, presentation movement history, mod palette interpretation for the built-in cat, browser verification, and the design handoff. No simulation coordinates or mod file format change.@@ -0,0 +1,40 @@
1+## MODIFIED Requirements2+3+### Requirement: Supported character glyphs SHALL use scoped facing state4+The presentation SHALL maintain horizontal facing per entity ID as visual state separate from simulation coordinates. The built-in MIAU 🐈 SHALL have native left-facing direction, including when a pack repeats that same glyph as a plain palette string. A mod palette object MAY declare `faces: 'left' | 'right'` for another profile glyph; a different plain string and a front-facing glyph such as FENN 🦊 SHALL remain non-directional by default. Every accepted horizontal displacement SHALL update a directional entity's facing to its travel direction, including being pushed. When a pushed entity also moves itself horizontally in the same turn, its self-movement direction SHALL take precedence. Vertical movement, transformation, idle frames, and blocked intents SHALL preserve prior horizontal facing. Undo SHALL restore per-ID facing history, while loading or resetting a level SHALL use its native declared or neutral facing. A facing change MAY use a glyph-only squash; reduced motion SHALL apply the direction immediately.5+6+#### Scenario: Built-in cat faces forward in every pack7+- **WHEN** a MIAU entity with the built-in 🐈 glyph moves right in a core proof or a pack with `palette.MIAU: '🐈'`8+- **THEN** the settled board mirrors the native-left glyph to face right, without mirroring its cell, shadow, or text9+10+#### Scenario: Leftward travel uses the native pose11+- **WHEN** that MIAU entity subsequently moves left12+- **THEN** the settled board draws the native-left glyph without a mirror13+14+#### Scenario: Pushes turn a directional actor15+- **WHEN** a directional entity is successfully pushed one cell to the right16+- **THEN** its settled horizontal facing is right, while a blocked push leaves its prior facing unchanged17+18+#### Scenario: Self-movement wins after a push19+- **WHEN** one accepted turn pushes an actor right and then moves that actor left under an automaton rule20+- **THEN** the actor's settled horizontal facing is left21+22+#### Scenario: Vertical movement preserves the horizontal pose23+- **WHEN** a MIAU entity moves up or down after facing right24+- **THEN** its horizontal glyph orientation remains right because the side-profile emoji has no vertical view25+26+#### Scenario: A transformation preserves per-ID facing27+- **WHEN** an entity transforms to another noun during a settled turn28+- **THEN** the entity ID retains its prior horizontal facing, unless the resulting noun has no directional glyph and uses its normal fallback29+30+#### Scenario: A custom mod glyph opts in explicitly31+- **WHEN** a mod supplies a different profile glyph with `faces: 'right'`32+- **THEN** leftward travel mirrors that glyph, while a different plain-string glyph is not mirrored33+34+#### Scenario: Undo and reset restore the correct pose35+- **WHEN** the player undoes a directional turn or resets/loads a level36+- **THEN** Undo restores the prior per-ID facing, and reset/load returns MIAU to the declared native-left pose37+38+#### Scenario: Reduced motion skips facing animation39+- **WHEN** reduced motion is enabled and a horizontal move changes facing40+- **THEN** the settled glyph faces its direction immediately without a transitional squash@@ -0,0 +1,11 @@
1+## 1. Native direction and movement2+3+- [x] 1.1 Declare a shared native-left face direction for the built-in 🐈 and resolve it even through an identical string palette entry.4+- [x] 1.2 Update accepted horizontal movement facing, including pushes and same-turn self-movement priority; keep blocked and vertical behavior stable.5+- [x] 1.3 Reuse the native direction on the proof, Title, and INDEX surfaces without mirroring text or non-directional glyphs.6+7+## 2. Verification and release8+9+- [x] 2.1 Add unit regressions for built-in and mod palettes, horizontal turns, pushes, blocked input, Undo, reset, and reduced motion.10+- [x] 2.2 Verify browser controls, rule changes, CommonJS mod loading, Undo, and right/left MIAU poses on desktop and mobile.11+- [ ] 2.3 Run the full Node suite, production build, strict OpenSpec validation, and update the public preview.