JS Labs
Primary public identity and research surface for James Sawyer.
labs.jamessawyer.co.uk
Phantom Tide
Maritime and Airspace Intelligence
This public deployment exposes a bounded starter surface. Read it as an operational reference: confirm access level, freshness, source family, and whether a result is directly observed or replay-derived before drawing conclusions.
One route is public by design: /api/public/aircraft/restricted-airspace-crossings. It is a bounded teaser and ingestion feed for replay-derived airspace-crossing candidates. The richer analyst ledger remains tier-limited inside Phantom Tide intel tables.
The rest of this guide explains how to interpret that split cleanly: what is public, what is capped, what is current, what is inferred, and which route or source family produced the visible state.
This is the public route that integrators and reviewers can call directly. It exposes candidate airspace crossings from replayed movement history and keeps the trust boundary explicit: public, bounded, replay-derived, and not a live alerting surface.
| Route | Access | Primary output | Trust note |
|---|---|---|---|
| /api/public/aircraft/restricted-airspace-crossings | Open public route | Bounded candidate crossing rows plus optional freshness and contract metadata. | Replay-derived context feed. Not a live alarm surface. |
| Parameter | Meaning |
|---|---|
| hours | Bound the replay window. Minimum effective window is one hour. |
| limit | Cap the returned rows for predictable polling and integration. |
| include_meta | Include freshness, reference context, quality, and contract blocks. |
| sample_after / sample_before | Use watermark polling on sample_at without refetching old rows. |
curl --max-time 30 --get \
'https://phantom.labs.jamessawyer.co.uk/api/public/aircraft/restricted-airspace-crossings' \
--data-urlencode 'hours=1' \
--data-urlencode 'limit=5' \
--data-urlencode 'include_meta=true'
{
"hours": 1,
"aircraft_count": 3,
"crossing_count": 2,
"latest_when": "2026-05-20T00:20:43",
"poll_after": "2026-05-20T00:20:43",
"crossings": [
{
"event_id": "airspace-crossing:sample-track:reference-zone:exited:2026-05-20T00:20:43",
"when": "2026-05-20T00:20:43",
"who": { "icao24": "sample01", "callsign": "TRACK01" },
"what": {
"transition": "exited",
"airspace": {
"feature_id": "reference-zone:sample",
"name": "Reference zone",
"restriction_label": "Restricted area"
}
},
"where": { "lat": 38.016, "lon": -123.144 }
}
],
"partial": false,
"empty_reason": null,
"quality": { "status": "current", "reference_available": true },
"contract": {
"mode": "public_candidate_restricted_airspace_crossing_feed",
"alert_surface": false,
"pollable": true
}
}
The interface is intentionally compact. It should tell you four things immediately: what state the system is in, what changed recently, which data families are fresh or stale, and whether the current view is showing direct evidence or a ranked inference surface.
Mode, refresh state, and access tier define what the page can claim.
Open the selected signal and inspect the direct source rows before trusting the map icon or score.
If evidence is direct and fresh, continue to history or area analysis.
If evidence is partial or degraded, narrow the area and corroborate with another family before reporting.
State colours are semantic, not decorative. A neutral page can still carry a strong operational hierarchy if the labels are explicit and the user can trace them to raw source conditions.
| State | Meaning | Operator implication |
|---|---|---|
| Live | Latest ingest succeeded and the source is updating on its expected cadence. | Treat absence as potentially meaningful only after confirming zoom, scope, and coverage. |
| Degraded | Source answered, but completeness, subtype fidelity, or quality fell. | Keep using it for context, not for clean negative assertions. |
| Stale | Old or cached data remains visible for continuity. | Useful for orientation. Unsafe for time-sensitive conclusions. |
| Tier-limited | Feature exists but the current access path is intentionally capped. | Do not confuse intentional suppression with lack of signal. |
Confidence should never be shown as a floating number without a basis. Confidence is a statement about source agreement, freshness, and directness of evidence.
Suggested UI labels: Observed Corroborated Estimated Weakly supported
Freshness should be visible in both relative and absolute time. Showing only “5m ago” is not enough for analysts working across time zones and archived sessions.
Every alert, zone, and summary should expose where it came from. Users need to distinguish direct observation, derived context, replay or archive-backed material, and plain inference without opening the code.
| Lineage label | What it means | How it should appear |
|---|---|---|
| Direct observation | Source row or primary detection from a feed such as AIS, OpenSky, VIIRS, NOTAM, or advisory text. | Visible source family badge, timestamp, and raw-access link. |
| Derived context | Geometry, proximity, recurrence, clustering, or replay-derived candidate events built from direct source material. | Explicit “derived” label plus the underlying source list. |
| Estimated field | Approximation, fallback classification, or incomplete identity enrichment. | Muted label, explanation tooltip, and lower confidence treatment. |
| Reference layer | Static or slowly changing contextual layer such as restricted airspace or infrastructure reference data. | Show snapshot age and missing-artifact status where relevant. |
The interface should support questions, not sightseeing. Each major workflow should collapse the analyst’s path from map signal to plain language answer with minimal mode switching.
The page and the product should share the same visual logic: restrained hierarchy, compact density, semantic colour, and tables wherever comparison matters more than decoration.
| Component | Purpose | Display rule |
|---|---|---|
| Header state bar | Primary operational truth for mode, sync state, access, and time basis. | Always visible. No decorative motion. |
| Intel table | Recent change surface where comparison, sorting, and keyboard navigation matter. | Prefer rows over cards. Make time, source family, and confidence scannable. |
| Detail panel | Evidence inspection unit for selected signal. | Separate observed, inferred, and reference context blocks. |
| Map | Spatial triage and area framing. | Only analytical geometry belongs here. No decorative overlays. |
| Area report | Plain-language output for a fixed radius and time frame. | Must inherit source state and freshness qualifiers from contributing layers. |
Source family matters as much as freshness. Some feeds are continuous, some hourly, some analyst-reviewed, and some reference-only. Users should be able to see both the family and the cadence without opening a settings panel.
| Family | Examples | Cadence logic |
|---|---|---|
| Transport broadcast | AIS, OpenSky aircraft state vectors, entity-feed context | Frequent. Best for motion and absence checks, but still subject to source outages and spoofing. |
| Advisory and warning | NOTAM, maritime advisories, navigation warnings, SIGMET | Periodic. Useful for declared restrictions, hazards, and official context windows. |
| Environmental and sensor | NDBC, VIIRS, seismic, GPS disruption, space weather | Mixed cadence. Often strongest when used to challenge transport claims. |
| Reference context | Restricted airspace, infrastructure layers, static overlays | Slow-moving. Must expose snapshot age and missing-artifact status. |
Progressive disclosure should reduce clutter without hiding the truth. The interface can be calm and dense at the same time if every reveal is in service of a real investigative decision.
Fast operators need reversible actions more than hidden power features. Keep `?`, `Escape`, time-basis toggle, intel focus, row navigation, and map-focus shortcuts stable so trust is preserved across modes and sessions.
Public operational documentation should also tell people who built the system and where the supporting material lives. That improves trust, search visibility, and technical discoverability without turning the page into self-promotion.
Primary public identity and research surface for James Sawyer.
labs.jamessawyer.co.ukBuilder profile for related public work, issues, and project context.
github.com/tg12Repository for platform history, source acknowledgements, and technical direction.
github.com/tg12/phantomtidePublic handle for product updates, surface changes, and operator-facing announcements.
x.com/_phantomtide