An interactive 2D traffic-management workbench, not a recorded animation. Add flights from your own callsign, position, flight level, bearing, speed and climb; or edit/import a WorldState JSON. Traffic advances from those velocity vectors. You can add/perturb/remove tracks, tune the horizontal/vertical separation envelope and look-ahead, run repeated planner passes, then approve and read back a world-bound setpoint before simulated actuation. A hash-chained audit trace can be verified in the page.
The browser hosts a faithful TypeScript port of the Python SafetyPolicy, AdvisoryPlanner, ControlRoom safety gates, canonical world/advisory hashes and SHA-256 audit log. tools/generate_airspace_reference.py executes the original Python classes to maintain four reference scenarios; Vitest checks the browser port against those outputs. Additional tests construct visitor-authored worlds and run them through conflict timing, advisory search, approval, readback, actuation and audit verification. No prerecorded output drives the UI, and there is no model, network, live aircraft or external data call.
python3 plan_world.py world.json inspects raw synthetic WorldState JSON with the
existing native planner and returns every individually screened alternative.
It preserves the saved input and performs no actuation. See PLAN_WORLD.md
for file/stdin use, clock and policy settings, complete results, and refusal limits.
For a saved synthetic Explorer result, select its before or after world explicitly and pass it to the same planner. In Bash:
set -o pipefail
python3 explorer_world.py approved-explorer.json --phase before | python3 plan_world.py -
python3 explorer_world.py approved-explorer.json --phase after | python3 plan_world.py -Replay recomputes the local synthetic fixture; the planner results remain
proposal_only: true. See EXPLORER_WORLD.md for creating
an export, complete replay validation and refusal statuses.
python3 compare_plans.py left.plan.json right.plan.json compares saved policy
experiments for the same exact native world and review clock, showing policy
changes and complete advisory membership/order without planning again.
See COMPARE_PLANS.md for exact identities, file limits and JSON output.
Create an explicit authored alternative with
python3 edit_world.py before.json --aircraft ALPHA --x-nm 4.5 --out after.json.
The new file preserves other aircraft and the recorded observation time, while
using the native one-step version increment. It does not plan or apply an advisory.
See EDIT_WORLD.md for all six field options, exact identity and
representation rules, and new-file output behavior.
The fixed ThinkPad installation provides
towerops-explorer --port 8765 after one explicit, reviewed adoption of the
accepted source. Open its printed loopback address to replay a saved synthetic
export and choose Explain this mismatch. The command runs in the foreground;
Ctrl+C stops it. Existing commands and prior versions are preserved by refusal
when the target command or TowerOps namespace is already occupied.
To see which saved fields differ from a locally reconstructed synthetic scenario,
add --explain to the replay command:
python3 explorer.py run approved > approved-explorer.json
python3 explorer.py replay approved-explorer.json --explainThe JSON result retains the ordinary replay summary and adds typed differences with JSON Pointer paths. These rows describe literal field differences in the local synthetic reproduction. It reports up to 32 differences and indicates when more were observed. Exit 0 means a match, exit 1 means a mismatch, and exit 2 means invalid input or a read, replay or output error. The input file is preserved. See EXPLORER.md for limits and complete output, or try the retained one-field mismatch example.
The audit checker reviews a saved hash chain, recorded lifecycle and world links without changing the trace or applying an advisory:
python3 audit_replay.py trace.json
python3 audit_replay.py - < trace.json
python3 audit_replay.py --helpA completed review emits a JSON summary; --help prints usage and exits 0.
For a review, exit 0 means no findings, exit 1 means findings, and exit 2 means
invalid arguments or an input, review or output error.
Supply one source at most; omit it or use - for stdin.
See AUDIT_REPLAY.md for accepted trace formats,
dash-prefixed filenames, output-failure behavior and the limits of the review.
For an existing towerops.world-plan.v1 report, inspect its recorded status,
clock, counts and all seven policy values without planning again:
python3 review_saved_plan.py after.plan.json
python3 review_saved_plan.py after.plan.json --jsonThe recorded candidate count stays distinct from saved alternatives. No option is selected or applied; internal body-hash consistency does not establish freshness, menu completeness or safety approval. See REVIEW_SAVED_PLAN.md for input and output limits.
From the repository root:
py -3 tools/generate_airspace_reference.py --check
cd web/airspace
npm ci
npm test
npm run buildOptional Raider browser acceptance and desktop/phone captures:
py -3 tools/capture_airspace.pyThe app uses synthetic or visitor-provided state only. It is a research simulation, not operational air-traffic-control software or aviation assurance. Approval/readback controls are fixtures, not real authority.