Skip to content

fix-batch-1: On Impact from any side, a11y leftovers from 1.41, missing node sockets - #445

Closed
AlexZ005 wants to merge 8 commits into
feat/52from
feat/52-fix-batch-1
Closed

AlexZ005 wants to merge 8 commits into
feat/52from
feat/52-fix-batch-1

Conversation

@AlexZ005

@AlexZ005 AlexZ005 commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

Lane fix-batch-1: small fixes from the plans review (owner, 2026-10-24) plus one item the orchestrator added (docs-1 Q1). One commit per item (eight in all, including two test/guard follow-ups). Base: feat/52 (4cd3daf).

#14 On Impact fires on a hit from any side (b727168)

  • Before, a contact only counted when the object was falling at ≥ 1.2 m/s, so a ball thrown at a wall or a target never fired On Impact. Now a contact also counts when the two objects close at ≥ 1.2 m/s along the contact normal, from any side.
  • On Impact gets a new direction: any | down option (shown on the card as "From").
    • New nodes start on any.
    • A node saved without the key reads down, so old scenes fire exactly as before. This uses a new legacy field on the param, which the Flow ⚙ panel also reads.
    • Emitters set to "On impact" still fire on landings only.
  • src/lib/impactSpeed.js is a new leaf module with unit tests.
  • e2e flow-impact-any: a ball rolled into a static wall and into a kinematic target.

#23 Accessibility leftovers from 1.41 (257e8f6)

  • Profile menu (53-int Q5): follows the ARIA menu-button pattern. Tab moves past it; Enter / Space / ↓ open it with focus on the first row; Esc closes it and returns focus to the button.
  • Compact header at large UI scales (53-int Q4): WindowChrome under data-ui-large.
    • The title joins flex line-breaking at its minimum width instead of its full width.
    • Header buttons stop growing at 120 %.
    • The decorative icon is hidden, and the back button shows its arrow only (the text stays as its accessible name).
    • The object list header's shed thresholds now follow the UI scale.
    • At 150 % on the folded N6, the Settings, Inspector and object list headers are each one row (they were 136 px over 2–5 rows). Nothing changes at 100 %.
  • New checks in a11y-axe (the profile-menu keys, plus an axe scan of the open panel) and a11y-scale (three one-row header checks).

Node sockets the runtime already reads (677d369, docs-1 Q1)

  • Missing sockets: flowSockets declared types for these inputs and the runtime read them, but the cards drew no socket, so they couldn't be wired by hand. The trigger edges hudActions creates had no handle to attach to either.
    • Set Game State and Set Variable get catalog inputs.
    • HudNode now draws sockets for HUD Rows and HUD Set Input.
  • HUD Timer: the card drew start, but triggerStampFor only counted an unnamed or trigger edge. start is now accepted as an alias.
  • Audit check: scripts/graph-audit.cjs now fails when a node reads an input that AnimationNode or HudNode never draws. It found Device Param (value) and Note Trigger (trigger, note, velocity) with the same gap; both are fixed here too.
  • e2e flow-sockets-wire wires each input with a real mouse drag in the node editor, then checks the input takes effect.

Round 2 (docs-1 CORE BUGS, 2026-10-25)

  • Rotate / Motor spin-up and HUD Timer autostart counted from the clock's origin (10111ec, follow-ups 0b5a1b1 and 0522e70). Verified first: the synced clock is seconds since UTC midnight, so every wheel was already past its ramp and ran at full speed from the first frame, and an autostart timer computed duration - time = 0.
    • The rotor now counts from the moment this peer saw it switch on (off → on spins up again from rest).
    • An autostart timer counts from when this peer first sees it.
    • Both re-base when the clock jumps back by more than 1 s (a midnight wrap, a session clock adopted on join).
    • e2e flow-clock-origin: 0.78 vs 6.04 rad/s (first half-second vs after the ramp); timer 59 → 55. On 4cd3daf: 4.70 vs 5.22 rad/s, timer 0.
    • Unit motionNodes: switched on at t = 51 300, the wheel spins up from rest; plus the off/on and clock-jump cases.
  • Sequence card (d90b960): at the standard 150 px card the wait fields' inputs were 12 px wide and every value was clipped.
    • "wait (s)" is now a single column heading, and each field keeps an accessible name ("wait before step N (seconds)").
    • The step label has a fixed 36 px width, so the field doesn't move when the ● lights.
    • Fields are now 68 px; e2e sequence-card checks every value fits.
  • Node descriptions (f42422d): 13 one-line descriptions corrected after checking each against its catalog entry and runtime: Sequence, Move Input, All Players, Character Controller, Move Speed, Camera Follow, Gamepad Axis, HUD Screen, HUD List, HUD Rows, Leaderboard, HUD Timer, HUD Input. Unit nodeDocsClaims fails all 6 checks on 4cd3daf.

Proof

Counterfactual = the suite run against the code before the fix, expected to fail.

suite this branch counterfactual
unit impactSpeed (10) pass — (new module)
unit nodeCatalogAudit undrawn-input guard pass red on 4cd3daf (exactly the 6 nodes)
e2e flow-impact-any ALL PASS 6 red on 4cd3daf
e2e a11y-axe, a11y-scale ALL PASS 7 red on 4cd3daf
e2e flow-sockets-wire ALL PASS 11 red on 4cd3daf
e2e flow-clock-origin ALL PASS 4 red on 4cd3daf
e2e sequence-card ALL PASS 3 red on 4cd3daf (12 px fields)
unit motionNodes switch-on case pass red on 4cd3daf
unit nodeDocsClaims (6) pass 6 red on 4cd3daf

Round 2 gates: vitest 213 files (2686 tests) pass; svelte-check 299 / 39; check:tokens clean; npm run build exit 0; e2e flow-node-docs, game-shell, flow-impact-static and every suite above pass on the final code.

Regression, all passing: flow-impact-static, particles-impact, flow-contact-filter, menu-keyboard-tab, avatar-customise, phone-sheets, hud-actions, hud-content, game-shell, flow-unknown-node, audio-devices. vitest: 212 files pass. svelte-check holds at 299 errors / 39 warnings. check:tokens is clean.

Known red, not from this branch:

  • keyboard-walk fails 5 checks in its "Ctrl+S names an unnamed scene" section; it fails 6 on 4cd3daf.
  • fluid-flows fails its recycling-river checks, the same way on 4cd3daf. Its rotor paddle check passes.
  • hud-content's "only nodetrigger on the wire" check also sees a nodesync message, on 4cd3daf too.
  • logic-nodes is timing-sensitive: a different check failed on each loaded run, and it passed completely when run alone.

Changelog (1.44.0)

  • On Impact now fires when an object hits something from any side (a ball thrown at a wall or a target), not only when it lands. New "From" option: any side / landing only. On Impact nodes in existing scenes keep "landing only".
  • The profile button opens with Enter or Space instead of on focus, so Tab moves past it.
  • At large UI scales on a narrow phone, window headers stay on one row with the close button beside the title.
  • Set Game State, Set Variable, HUD Rows, HUD Set Input, Device Param and Note Trigger now show the input sockets they always read, so they can be wired by hand. HUD Timer's start input starts the timer.
  • Rotate / Motor's Spin-up now ramps from rest when the wheel switches on (it used to run at full speed at once), and a HUD Timer with Autostart counts down from its duration (it used to read 0).
  • The Sequence card's wait fields show their values at the standard card width.
  • Corrected descriptions for 13 nodes (Sequence, Move Input, All Players, Character Controller, Move Speed, Camera Follow, Gamepad Axis and six HUD nodes).

Left for later

  • At 150 %, "Comfortable" and "Medium" still break mid-word; fixing that needs shorter labels at large scales, which is a wording decision.
  • Emitters set to "On impact" have no direction option.
  • The autostart timer and the rotor's spin-up run per peer: a player who joins later sees their own start. A timer everyone must agree on should have a shared pulse wired into start.
  • Real-device checks to do: TalkBack on the N6 and a hardware keyboard for the profile menu, and headers at 150 % on the folded N6.

Handover and evidence: ~/.code/handovers/done/STATUS-fix-batch-1-*.md, ~/.code/lanes-30/after-52/fix-batch-1/.

🤖 Generated with Claude Code

AlexZ005 and others added 8 commits October 24, 2026 17:27
…anding

The impact rule was "pre-step downward velocity >= 1.2 m/s", so a ball thrown
sideways at a wall or a target never fired On Impact. A contact now also counts
when the two bodies close along the contact normal (rapier's manifold) at
>= 1.2 m/s. The downward test stays as its own channel with its own cooldown:
On Impact gains `direction: any | down` — new nodes are seeded 'any', a node
saved without the key reads 'down' (param `legacy`, honoured by the Flow panel),
so old scenes fire exactly as before; emitters' "On impact" keep the landing rule.

impactSpeed.js is the leaf (closingSpeed / impactStrengthFor), unit-tested;
e2e flow-impact-any (red on 4cd3daf: the 'any' nodes never fire on the
wall/target hit).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… 150 % on the folded N6

Profile circle (53-int Q5): it opened on focus, so Tab walked the whole panel.
Now the ARIA menu-button pattern: Tab passes it, Enter / Space / Down open it with
focus on the first row, Escape closes and returns focus to the circle.

Compact header (53-int Q4): at a large UI scale a WindowChrome header wrapped
before it ellipsized (flex lines break on hypothetical sizes). The title enters
line-breaking at its minimum, header buttons stop growing at 120 %, the panel
icon and the back label's text step aside (still the accessible name). The
object list header's shed thresholds follow the scale and its search narrows.
Settings / Inspector / object list headers are one row at 150 % folded.

Rows: a11y-axe (profile menu keys + axe on the open panel), a11y-scale (three
one-row header checks on the folded N6 at 150 %).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…le, HUD Rows, HUD Set Input; HUD Timer honours start

Orchestrator add (docs-1 Q1). flowSockets typed these inputs and the runtime
read them, but the cards drew no socket, so they could not be wired by hand
(hudActions' own 'trigger' wires had nowhere to land): Set Game State
(trigger) and Set Variable (trigger, value) gain catalog `inputs`; HudNode
draws HUD Rows (trigger, text) and HUD Set Input (trigger, value, options).
HUD Timer drew `start` but triggerStampFor only counted an unnamed/`trigger`
wire — it now takes `start` as an alias.

The audit (scripts/graph-audit.cjs) gains an undrawn-input guard for the two
generic cards; it found Device Param (value) and Note Trigger (trigger, note,
velocity) with the same gap, fixed here too. Unit guard red on 257e8f6 with
exactly those six; e2e flow-sockets-wire wires each by mouse and checks the
effect (11 red on 257e8f6).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…r start, not the clock's origin

docs-1 CORE BUGS (verified): the rotor's ramp and an autostart HUD Timer both
measured from t = 0 of the clock they are handed, and the synced clock is
seconds since UTC midnight — every wheel was past its spin-up from the first
frame (full speed at once) and an autostart timer read 0 the moment it
appeared. The rotor now counts from the moment this peer saw it switch on
(off -> rests and spins up again from rest); an autostart timer from when
this peer first saw it. Both re-base when the clock goes back (midnight, a
session clock adopted on join) instead of freezing.

e2e flow-clock-origin: 4 red on 4cd3daf (rotor 4.70 of 5.22 rad/s in its
first half-second; timer 0), branch: 0.55 vs 4.67 rad/s, timer 59 -> 55.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Each checked against the node's catalog entry and runtime before rewriting:
Sequence fires all four steps from one pulse (not one per pulse, no wrap);
Move Input is WASD x/y only (no stick, no jump); All Players is a group gate,
not an iterator; Character Controller sets the player's own movement model;
Move Speed writes on `set`; Camera Follow has no distance/height; Gamepad Axis
is the two sticks (L2/R2 are buttons); HUD Screen acts per pulse (show / hide
/ toggle); HUD List names the element, title and row cap; HUD Rows and
Leaderboard write a HUD List element; HUD Timer a HUD Timer element; HUD Input
also reads sliders, toggles, dropdowns and tabs.

These lines feed the palette tooltip, the info pane and the docs-site node
pages. Unit guard tests/unit/nodeDocsClaims.test.js: 6/6 red on 4cd3daf.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…rd card width

docs-1: at the 150 px card a "wait" word on every row plus a 48 px step label
left each field's input 12 px wide — the values read as empty boxes. "wait (s)"
is now said once as the column heading (each field keeps an accessible name,
"wait before step N (seconds)"), the step label is a fixed 36 px so the field
does not jump when the ● lights, and the field takes the rest: 68 px, "10.50"
fits.

e2e sequence-card: base 4cd3daf 12 px fields, all four values clipped.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The two pose tests called applyRotor once at t = 1 and expected the angle from
the clock's origin; they now switch the wheel on at t = 0 first. New: a wheel
switched on at t = 51 300 (mid-day on the synced clock) spins up from rest,
off -> on spins up again, and a clock that goes back re-bases — red on
4cd3daf's motionNodes.js.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…1 s back)

Follow-up to 10111ec: a frame of jitter before the switch-on time no longer
moves the start; only a jump back of more than a second (midnight, a session
clock adopted on join) re-bases. Unit test covers the jitter case.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@AlexZ005

Copy link
Copy Markdown
Collaborator Author

In main via 52-int: merged into feat/52-int (8cccf49) and released in 1.45.0 (#482, tag v1.45.0 e59e96a, live on production).

@AlexZ005 AlexZ005 closed this Oct 26, 2026
@AlexZ005
AlexZ005 deleted the feat/52-fix-batch-1 branch October 26, 2026 20:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant