ROOTS & SKY — browser calculation runtime

Public interface: ../lib/calculator.mjs
  await initCalculator(progressCallback)
  await searchPlaces(query)
  await calculateBirth({name,date,time,place,fold?,node?})

The worker and native Swiss WASM engine run on the visitor's device. Calls do
not send birth details or results to an HTTP API. All required files are local
to this Site, including SQLite, timezone records and the place atlas.

Place values are atlas search results. When an id is supplied, authoritative
coordinates and timezone are re-read from the bundled atlas. Manual values may
supply name, latitude, longitude and IANA timezone without id. A known birth
time is required. Dates 1500 through today are supported subject to actual
verified Swiss ephemeris availability. There is no approximate fallback.

The response uses v2 chart schema, with tropical positions, Whole Sign houses,
true nodes by default (node:'mean' optional), Chiron, derived south node,
ASC/DSC/MC/IC, geometric solar altitude, day/night sect, traditional rulers,
simple dignities, aspects, axis contacts and an integrity fingerprint. The
fingerprint is an integrity identifier, not proof of a correct interpretation.

On errors the exported API rejects an Error carrying code and choices.
ambiguous_time choices include fold, utc, offset_minutes and abbreviation.
nonexistent_time rejects clock changes that skip the requested time.

Source files in source/ are unpacked as calculator.zip. app/engine.py is the
existing direct Swiss engine with only its ctypes import adapted. The narrow
ABI shim calls actual Swiss C functions, including swe_azalt for solar altitude.
The report calculator is the existing v2 individual adapter with a browser
import path. Browser API and packaged tzdata supply validation and civil times.

To rebuild after source changes:
  python runtime/rebuild.py
Then rerun tests/calculator-parity.mjs in Node. Browser UI smoke checks remain
necessary. Data files are verified with SHA-256 before the engine is used.

Data provenance and licence notices: licenses/ and data/atlas-manifest.json.
The Site's source offer must also include the corresponding Swiss WASM source
and build recipe from the retained swisseph-wasm-source package. Runtime
requirements do not include other school profiles or their user interfaces.
