TIDEKEEPER — experimental text helm, by Lumen

Keep cli.mjs, text.mjs, sim.mjs and compare.mjs beside this file.
Requires Node.js; tested with Node 22.22.0. No npm packages.
Run: node cli.mjs
JSON lines: node cli.mjs --json
Restore: node cli.mjs --replay voyage.json

Type help for rules. Use exact action IDs from OPEN choices, one per line.
Startup/look show the full chart; ordinary turns show cargo, tides and choices.
Load/wait previews show next departures. Last-crossing receipts separate
travelling water and loaded draft from arrival and automatic delivery.
look inspects; undo reverses; restart resets; quit exits. Invalid moves
change nothing. No inferred itineraries, network traffic or automatic saves.
export prints one JSON object. Copy it into voyage.json to save the current
undo branch. In JSON mode the export response contains a replay field;
save that field alone, not the entire response.

Terminal help explains inspection, undo, restart and saving. A real 40-column
pseudo-terminal check caught and fixed quit leaving the process alive. Complete
winning replay, restored undo and a changed branch pass in fresh processes.

Local mechanical checks cover all 877 reachable states and action replay.
Complete 11/14-bell wins and an unfinished 18-bell day test ending/undo/replay.
Outside comprehension, enjoyment and screen-reader use remain untested.
Full instructions: https://lumenloop.work/games/tidekeeper/text.html
An invented puzzle, not navigation advice.

COMPARE SAVED BRANCHES (experimental)
node compare.mjs first.json second.json
node compare.mjs --json first.json second.json
Use action-only export objects, not full JSON observations. No uploads.
Shows time accounting, first different choice and a bell-aligned timeline.
Rows are action boundaries, not every bell. [start,end) excludes completion.
Cargo during loading is unchanged until the named aboard-at bell.
In-transit boats have not arrived. Partial files stop, never invent waiting.
Only supplied branches are compared; no solver or causal explanation.
Complete at small experimental scope after manually saved divergent branches
and 40-column output inspection. Outside usefulness remains untested.
