release: promote development → master (v1.25.1) #292

Merged
developer merged 2 commits from development into master 2026-07-27 22:02:47 +00:00
Owner

Patch release. Carries a single change over master: PR #291.

fix(ui): highlight the word the engine played, not the run it abuts

In a one-word-per-turn game, staging a single tile that plays a valid word down a column while merely abutting a longer horizontal word greened that horizontal run instead — a word the play does not form — and anchored the score badge on it. The score, the caption and the committed move were all correct; only the highlight was wrong.

Cause: two independent derivations of the play's orientation. lib/formed.ts re-guessed the axis as "the longer run wins", while the engine (lib/dict/direction.ts playDirection, a port of engine.(*Game).playDirection) settles a lone tile under the single-word rule through the validator, because its two orientations can differ in legality.

Fix: formedGeometry now takes the orientation from the preview (EvalResult.dir, already carried by the on-device evaluator, the network evaluate and a reused hint alike) and no longer infers it — no second implementation is left to drift. Reported offline, but the trigger is the rule rather than the transport, so online one-word games are fixed too.

Scope

  • UI only. No schema, wire, config, dictionary or deploy change — an image roll, nothing owner-side.
  • docs/FUNCTIONAL.md already described the intended behaviour; no doc change.

Verification

  • ui CI job locally: check, test:unit (674), build, bundle-size (app entry 130.3 / 131 KB), test:e2e (256, chromium + webkit).
  • CI #997 (PR into development) and #998 (post-merge, incl. the gated test-contour deploy) — both ALL GREEN.
  • New formed.engine.test.ts pins the highlight against the engine port over random positions; reverting the old inference fails it on exactly the one-word-rule cases.
Patch release. Carries a single change over `master`: PR #291. ## fix(ui): highlight the word the engine played, not the run it abuts In a **one-word-per-turn** game, staging a single tile that plays a valid word down a column while merely **abutting** a longer horizontal word greened that horizontal run instead — a word the play does not form — and anchored the score badge on it. The score, the caption and the committed move were all correct; only the highlight was wrong. Cause: two independent derivations of the play's orientation. `lib/formed.ts` re-guessed the axis as "the longer run wins", while the engine (`lib/dict/direction.ts` `playDirection`, a port of `engine.(*Game).playDirection`) settles a lone tile under the single-word rule through the validator, because its two orientations can differ in legality. Fix: `formedGeometry` now takes the orientation from the preview (`EvalResult.dir`, already carried by the on-device evaluator, the network `evaluate` and a reused hint alike) and no longer infers it — no second implementation is left to drift. Reported offline, but the trigger is the rule rather than the transport, so online one-word games are fixed too. ## Scope - UI only. No schema, wire, config, dictionary or deploy change — an image roll, nothing owner-side. - `docs/FUNCTIONAL.md` already described the intended behaviour; no doc change. ## Verification - `ui` CI job locally: `check`, `test:unit` (674), `build`, bundle-size (app entry 130.3 / 131 KB), `test:e2e` (256, chromium + webkit). - CI #997 (PR into development) and #998 (post-merge, incl. the gated test-contour deploy) — both ALL GREEN. - New `formed.engine.test.ts` pins the highlight against the engine port over random positions; reverting the old inference fails it on exactly the one-word-rule cases.
developer added 2 commits 2026-07-27 22:00:06 +00:00
fix(ui): highlight the word the engine played, not the run it abuts
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 1m20s
CI / conformance (pull_request) Successful in 10s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m58s
27e19e82bd
The board's green highlight re-derived the play's orientation itself
("the longer run wins"), while the engine settles a lone staged tile
under the single-word rule through the validator, because its two
orientations can differ in legality. A vertical play that merely abuts a
longer horizontal word therefore greened that horizontal run — a word
the play does not form — and anchored the score badge on it, while the
caption, the score and the committed move all stayed correct.

formedGeometry now takes the orientation from the preview, which every
preview source already carries (EvalResult.dir: the on-device evaluator,
the network evaluate and a reused hint), and no longer infers it. The
rule, not the transport, is the trigger, so this fixes online one-word
games as well as offline ones.

A differential test now walks random positions, asks the engine port for
every legal play it can find, and asserts the highlighted cells are
exactly the cells of the words the engine says that play forms.
Merge pull request 'fix(ui): highlight the word the engine played, not the run it abuts' (#291) from fix/offline-highlight-direction into development
CI / changes (push) Successful in 2s
CI / unit (push) Has been skipped
CI / integration (push) Has been skipped
CI / ui (push) Successful in 1m18s
CI / conformance (push) Successful in 11s
CI / gate (push) Successful in 1s
CI / deploy (push) Successful in 1m55s
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Successful in 1m16s
CI / conformance (pull_request) Successful in 11s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Has been skipped
985ed40639
owner approved these changes 2026-07-27 22:02:28 +00:00
developer merged commit 67c4504eb9 into master 2026-07-27 22:02:47 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/scrabble-game#292