Local Level Lab

Airborne measurements. Open methods.

Developer setup and tools

This is the technical setup guide. For the experiment itself, start with the README and methodology. Collecting a recording and validating a scientific result are separate tasks; see Validation.

Analysis

Python 3.11 or newer is supported. The lockfile records the Python 3.14 validation environment; older supported interpreters need compatible dependency versions instead. These examples use an existing virtual environment at ~/venv; do not install into system Python.

~/venv/bin/python -m pip install -r requirements-lock.txt -e analysis -e server
~/venv/bin/lll synth demo.zip --truth sphere_rotating
~/venv/bin/lll analyze demo.zip
~/venv/bin/lll collate . -o collated --include-synthetic
~/venv/bin/lll bench session.zip
~/venv/bin/python -m pytest analysis/tests server/tests

Synthetic sessions are excluded from ordinary collation; the example explicitly enables them. Analysis produces a machine-readable result and an HTML report. Neither a software quality label nor a provisional significance value establishes validated scientific eligibility.

For new work use at most four numerical threads in total, shared across active jobs. One worker can use four threads, two workers can use two each, or four workers can use one each. Frozen studies retain their recorded settings; the current archival recovery remains at two threads. Reserve other active jobs' allocations before launching.

The guard rejects oversubscription and sets numerical-library limits before imports:

~/venv/bin/python analysis/tests/run_numerical.py -- ~/venv/bin/python -m pytest analysis/tests

Use --workers 2 for a target running two concurrent workers. While another job uses two threads, include --reserved-threads 2. The guard validates the declared allocation; it does not discover other jobs or set the target's worker count. New launchers may instead call lll.compute_budget.environment before numerical imports and freeze the validated allocation. Historical launch commands and limits remain part of their original freezes. Expensive simulation campaigns have their own explicit case and time budgets; a resource setting is not permission to launch them. The historical evidence generator runs simulations and prints Markdown for the technical evidence record; it is not a lightweight documentation check.

Upload server

~/venv/bin/lll-server --data /srv/lll serve --host 127.0.0.1 --port 8000
~/venv/bin/lll-server --data /srv/lll process
~/venv/bin/lll-server --data /srv/lll process --reprocess
~/venv/bin/lll-server --data /srv/lll collate
~/venv/bin/lll-server --data /srv/lll export dump/

Use a reverse proxy for TLS, upload limits and public deployment. Raw archives remain unchanged when generated reports are reprocessed. The curation guide describes instrument registration, bench certification, session approval, migration and deployment constraints.

Public endpoints are upload and index at /api/v1/sessions, session metadata at /api/v1/sessions/{id}, original archives at /api/v1/sessions/{id}/raw, session reports at /api/v1/sessions/{id}/report, and the pooled report at /report.

Configuration uses LLL_DATA, LLL_MAX_UPLOAD_MB (default 200), LLL_MAX_UNCOMPRESSED_MB (default 2000), and LLL_UPLOADS_PER_HOUR (default 20). Per-IP limits use the address seen by the application, so configure trusted forwarding correctly behind a proxy.

Android

Open android/ in Android Studio. The build uses Android SDK 35 and JDK 17 or 21. In this workspace use the installed JDK under ~/.local/jdk21 and limit Gradle to two workers:

env JAVA_HOME="$HOME/.local/jdk21" ./android/gradlew --project-dir android --max-workers=2 assembleDebug

The default upload destination can be set with lll.serverUrl in android/gradle.properties. Users can change it in Settings. Choose the Bluetooth variant and verify IMU settings before recording. New participant sessions are stationary A/B recordings; aircraft identity, placement and flight dashboards are removed from the active flow. Session schema 3 adds a versioned stationary metadata object while retaining historical flight archives. The legacy airline asset and its ODbL license remain for historical reproducibility.

Use lll analyze stationary.zip for the new preliminary signed-rate report. It skips airborne fitting and estimates no latitude curve or calibrated significance. The existing flight collator is not a stationary population estimator; do not apply its thresholds or unit certificates to ground recordings. See the stationary method.

Documentation and reproducibility

The public website build renders the root README and linked Markdown as a GitHub Pages site at locallevellab.com. Data downloads and source files remain on GitHub. Website dependencies and checks are separate from the frozen numerical environment; building the site runs no scientific analysis.

Public guides explain the method and current evidence without requiring raw research files. MATH, the technical methodology record, technical validation record, technical bench checklist and recording format preserve equations, thresholds, commands and data contracts. Contributing describes checks appropriate to a proposed change.

Historical aircraft route replay and design

The core-pipeline handoff documents the new optional research paths and frozen prospective inputs. Preparation writes specifications and cost bounds without running flights. Geometry search uses assumed axes and a finite uncertainty grid; empirical policies remain unavailable for observed-track replay. A campaign or nontrivial optimizer search requires a separate compute budget. Future work shares a four-thread total budget; historical freezes keep their original worker and numerical-thread settings.