Search input storage removal
============================

Production edits are restricted to isolated slim-work source:
  search.h, search.cpp, gcbridge.cpp
The baseline source and released binaries are unchanged.

SearchInput previously held one board, one complete move/value list and a
32-bit depth limit. Its original native size was 5,780 bytes. The revised
controller receives const board_t *source and gc_int depth_limit as ordinary
arguments; it owns no persistent input copy. After the independent board
packing changes, retaining that old object would cost 3,737 bytes. These two
figures describe the same removal at different layouts and must not be added.

The only production caller is GCEngine. It passes Game, which has process
lifetime. The synchronous search reads Game and makes temporary/search moves
only on SearchCurrent's dedicated working board. Existing UI busy guards and
process ownership are unchanged. TimerSleep yields to other native threads;
it does not process a new application event in this call stack.

At search start, Game is copied to SearchCurrent, and legal moves are generated
directly into SearchRoot's list. The same generator and move order are used.
The previous generic list_copy is removed. search_full_init performs the same
root scoring/ordering. At each iterative depth the working board is restored
from Game. Root list ordering persists across iterations as before.

Game, Previous and SearchCurrent remain separate boards. One-turn Undo and
all 256 repetition-history entries remain. Cache sizes, search depth limits,
arithmetic types and search heuristics are unchanged by these edits. Function
arguments add transient call-stack bytes, accounted for by the separate native
stack measurements; fixed-RAM savings are not a promise of equal stack use.

The paired host harness includes each bridge implementation in its test-only
translation unit so that it can compare semantic Game/Previous state without
adding shipping exports. It checks every search before applying a move leaves
Game and bridge Undo flags unchanged. Semantic snapshots include all mailbox
squares/positions, active piece/pawn lists and sentinels, twelve meaningful
material counters, pawn-file masks, metadata, three incremental keys and active
repetition history. Unused array capacity and inactive history are excluded.

Every paired JSON record must match exactly: moves, scores, nodes, PV, flags,
maximum search height, position/FEN, turn/status, Game state, previous state
and Undo lifecycle. Compiler source hashes detect edits during compilation.
The host uses explicit32-bit gc_int, packing1 and UBSan; separate tests execute
the actual16-bit production resources to cover segmented-pointer arithmetic.
