Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
f66dc19
Address structural rendering, loading, and ephemeris weaknesses
Protonmatter Nov 11, 2026
371698b
Align the System browser smoke with demand loading and deferred frames
claude Nov 11, 2026
04475dc
Accept pinned JPEG reference images in the source-grid check
claude Nov 11, 2026
1e5e0c1
Check reference-layer provenance where the caption now places it
claude Nov 11, 2026
1073860
Keep the System accuracy line from reflowing as its epoch advances
claude Nov 11, 2026
f1869bd
Plan moon-shadow transit frames for physical-scale body inspection
claude Nov 11, 2026
371c30f
Measure the Io eclipse on a focused, physical-scale Io
claude Nov 11, 2026
d039f56
Frame the physical-scale Earth for the Earth look probe
claude Nov 11, 2026
da7205b
Back off failed quality upgrades and let paused scenes recover
claude Nov 11, 2026
ca0aa8d
Redraw only for real pointer interaction and widen touch targets
claude Nov 11, 2026
959a2ad
Keep the selected label beside a target near a canvas corner
claude Nov 11, 2026
b0cfb62
Skip unchanged label writes and cache the jump-bar inset
claude Nov 11, 2026
7ce4be7
Fade Sky star hit targets and paths with daylight
claude Nov 11, 2026
d8212ba
Require the wasm-release profile when validating current sources
claude Nov 11, 2026
a006698
Frame the physical-scale Earth for the submitted-spin gates
claude Nov 11, 2026
687e4d1
Point diagnostic facades at their owning chunks
claude Nov 11, 2026
7530c4d
Version the widened ephemeris snapshot contract as v4
claude Nov 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,12 @@ jobs:
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: "3.12"
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22"
cache: npm
- name: Install locked release compiler
run: npm ci --ignore-scripts
- name: Build and stage final bytes once
run: |
python tools/build_wasm.py --locked --out-root build/wasm
Expand Down Expand Up @@ -383,7 +389,7 @@ jobs:
if-no-files-found: warn
retention-days: 90

- name: Ephemeris v3 structural schema
- name: Ephemeris v4 structural schema
run: |
python - <<'PY'
import json
Expand All @@ -392,7 +398,7 @@ jobs:
sys.path.insert(0, "tools")
import jsonschema_min
data = json.loads(Path("/tmp/ephemeris-v3.json").read_text(encoding="utf-8"))
schema = json.loads(Path("docs/ephemeris-snapshot-v3.schema.json").read_text(encoding="utf-8"))
schema = json.loads(Path("docs/ephemeris-snapshot-v4.schema.json").read_text(encoding="utf-8"))
errors = jsonschema_min.validate(data, schema)
if errors:
print("\n".join(f"ERROR: {error}" for error in errors), file=sys.stderr)
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,11 @@ jobs:
--source=services/ephemeris-server,tools \
-m unittest discover -s tests/python -p 'test_*.py' -v
coverage report \
--include='services/ephemeris-server/server.py,tools/browser_smoke.py,tools/build_wasm.py,tools/build_web.py,tools/collect_moon_evidence.py,tools/data_bundles.py,tools/delivery_lifecycle.py,tools/ephemeris_distribution.py,tools/fetch_earth_reference.py,tools/fetch_public_data.py,tools/generate_eop.py,tools/generate_fixture_snapshot.py,tools/generate_moons.py,tools/horizons_apparent.py,tools/horizons_events.py,tools/horizons_observer_seasonal.py,tools/horizons_ranges.py,tools/horizons_reference.py,tools/horizons_vectors.py,tools/jsonschema_min.py,tools/moon_model.py,tools/observation_provenance.py,tools/orrery_delivery.py,tools/orrery_earth.py,tools/orrery_refresh.py,tools/precision_window_reference.py,tools/rebuild_coefficients.py,tools/release_changes.py,tools/release_crate.py,tools/release_evidence.py,tools/release_policy.py,tools/run_daily_ingest.py,tools/snapshot_semantics.py,tools/startup_contract.py,tools/validate_accuracy_evidence.py,tools/validate_apparent.py,tools/validate_docs.py,tools/validate_ephemeris.py,tools/validate_ephemeris_snapshot.py,tools/validate_ephemeris_snapshot_v2.py,tools/validate_moons.py,tools/validate_operational_readiness.py,tools/validate_physical_assets.py,tools/validate_planet_phenomena.py,tools/validate_precision_window.py,tools/validate_ranges.py,tools/validate_release_manifest.py,tools/validate_sdlc.py,tools/validate_snapshot.py,tools/validate_ux_contract.py,tools/validate_vectors.py,tools/validate_visual_assets.py,tools/validate_web_static.py,tools/validation_output.py,tools/verify_served_release.py,tools/wasm_provenance.py' \
--include='services/ephemeris-server/server.py,tools/browser_smoke.py,tools/build_wasm.py,tools/build_web.py,tools/collect_moon_evidence.py,tools/data_bundles.py,tools/delivery_lifecycle.py,tools/ephemeris_distribution.py,tools/fetch_earth_reference.py,tools/fetch_public_data.py,tools/generate_eop.py,tools/generate_fixture_snapshot.py,tools/generate_independent_vector_evidence.py,tools/generate_moons.py,tools/horizons_apparent.py,tools/horizons_events.py,tools/horizons_observer_seasonal.py,tools/horizons_ranges.py,tools/horizons_reference.py,tools/horizons_vectors.py,tools/independent_vector_evidence.py,tools/jsonschema_min.py,tools/moon_model.py,tools/observation_provenance.py,tools/orrery_delivery.py,tools/orrery_earth.py,tools/orrery_refresh.py,tools/precision_window_reference.py,tools/rebuild_coefficients.py,tools/release_changes.py,tools/release_crate.py,tools/release_evidence.py,tools/release_policy.py,tools/run_daily_ingest.py,tools/snapshot_semantics.py,tools/startup_contract.py,tools/validate_accuracy_evidence.py,tools/validate_apparent.py,tools/validate_docs.py,tools/validate_ephemeris.py,tools/validate_ephemeris_snapshot.py,tools/validate_ephemeris_snapshot_v2.py,tools/validate_independent_vector_evidence.py,tools/validate_moons.py,tools/validate_operational_readiness.py,tools/validate_physical_assets.py,tools/validate_planet_phenomena.py,tools/validate_precision_window.py,tools/validate_ranges.py,tools/validate_release_manifest.py,tools/validate_sdlc.py,tools/validate_snapshot.py,tools/validate_ux_contract.py,tools/validate_vectors.py,tools/validate_visual_assets.py,tools/validate_web_static.py,tools/validation_output.py,tools/verify_served_release.py,tools/wasm_provenance.py' \
--fail-under=90 --show-missing
mkdir -p coverage
coverage xml -o coverage/python.xml \
--include='services/ephemeris-server/server.py,tools/browser_smoke.py,tools/build_wasm.py,tools/build_web.py,tools/collect_moon_evidence.py,tools/data_bundles.py,tools/delivery_lifecycle.py,tools/ephemeris_distribution.py,tools/fetch_earth_reference.py,tools/fetch_public_data.py,tools/generate_eop.py,tools/generate_fixture_snapshot.py,tools/generate_moons.py,tools/horizons_apparent.py,tools/horizons_events.py,tools/horizons_observer_seasonal.py,tools/horizons_ranges.py,tools/horizons_reference.py,tools/horizons_vectors.py,tools/jsonschema_min.py,tools/moon_model.py,tools/observation_provenance.py,tools/orrery_delivery.py,tools/orrery_earth.py,tools/orrery_refresh.py,tools/precision_window_reference.py,tools/rebuild_coefficients.py,tools/release_changes.py,tools/release_crate.py,tools/release_evidence.py,tools/release_policy.py,tools/run_daily_ingest.py,tools/snapshot_semantics.py,tools/startup_contract.py,tools/validate_accuracy_evidence.py,tools/validate_apparent.py,tools/validate_docs.py,tools/validate_ephemeris.py,tools/validate_ephemeris_snapshot.py,tools/validate_ephemeris_snapshot_v2.py,tools/validate_moons.py,tools/validate_operational_readiness.py,tools/validate_physical_assets.py,tools/validate_planet_phenomena.py,tools/validate_precision_window.py,tools/validate_ranges.py,tools/validate_release_manifest.py,tools/validate_sdlc.py,tools/validate_snapshot.py,tools/validate_ux_contract.py,tools/validate_vectors.py,tools/validate_visual_assets.py,tools/validate_web_static.py,tools/validation_output.py,tools/verify_served_release.py,tools/wasm_provenance.py'
--include='services/ephemeris-server/server.py,tools/browser_smoke.py,tools/build_wasm.py,tools/build_web.py,tools/collect_moon_evidence.py,tools/data_bundles.py,tools/delivery_lifecycle.py,tools/ephemeris_distribution.py,tools/fetch_earth_reference.py,tools/fetch_public_data.py,tools/generate_eop.py,tools/generate_fixture_snapshot.py,tools/generate_independent_vector_evidence.py,tools/generate_moons.py,tools/horizons_apparent.py,tools/horizons_events.py,tools/horizons_observer_seasonal.py,tools/horizons_ranges.py,tools/horizons_reference.py,tools/horizons_vectors.py,tools/independent_vector_evidence.py,tools/jsonschema_min.py,tools/moon_model.py,tools/observation_provenance.py,tools/orrery_delivery.py,tools/orrery_earth.py,tools/orrery_refresh.py,tools/precision_window_reference.py,tools/rebuild_coefficients.py,tools/release_changes.py,tools/release_crate.py,tools/release_evidence.py,tools/release_policy.py,tools/run_daily_ingest.py,tools/snapshot_semantics.py,tools/startup_contract.py,tools/validate_accuracy_evidence.py,tools/validate_apparent.py,tools/validate_docs.py,tools/validate_ephemeris.py,tools/validate_ephemeris_snapshot.py,tools/validate_ephemeris_snapshot_v2.py,tools/validate_independent_vector_evidence.py,tools/validate_moons.py,tools/validate_operational_readiness.py,tools/validate_physical_assets.py,tools/validate_planet_phenomena.py,tools/validate_precision_window.py,tools/validate_ranges.py,tools/validate_release_manifest.py,tools/validate_sdlc.py,tools/validate_snapshot.py,tools/validate_ux_contract.py,tools/validate_vectors.py,tools/validate_visual_assets.py,tools/validate_web_static.py,tools/validation_output.py,tools/verify_served_release.py,tools/wasm_provenance.py'
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
if: always()
with:
Expand Down
16 changes: 13 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,21 @@ repository = "https://github.com/Protonmatter/sol"
# job (and lower this deliberately) before the first crates.io release if older matters.
rust-version = "1.85"

# The two cdylibs ship to browsers on every page load — optimize the artifact, not the
# compile: z + fat LTO + one codegen unit + abort typically ~halves a raw wasm binary.
# Keep compact native release builds; tests and native consumers use the default
# unwind strategy. Browser-specific abort and speed settings live below.
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = true

# Browser builds keep the release size/LTO settings but never unwind across the
# raw WASM ABI. A separate profile avoids native test abort/unwind collisions.
[profile.wasm-release]
inherits = "release"
panic = "abort"

# Full-precision ephemeris evaluation is a measured per-frame hot path. This
# speed optimization is WASM-only; no fast-math flags or accuracy changes.
[profile.wasm-release.package.solar-ephemeris]
opt-level = 3
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ separate artifacts and have not been revalidated as matching this checkout. Pass
tests do not establish hosted CI, accepted scientific/manual evidence or production approval.

Live contracts are [solar-state-snapshot.v3](docs/solar-state-snapshot-v3.schema.json),
[ephemeris-snapshot.v3](docs/ephemeris-snapshot-v3.schema.json), and
`system-snapshot.v1`. Historical v2 remains separately inspectable; live readers reject
[ephemeris-snapshot.v4](docs/ephemeris-snapshot-v4.schema.json), and
`system-snapshot.v1`. Historical ephemeris v3 and v2 remain separately inspectable; live readers reject
unsupported versions rather than silently relabelling data.

## What the application does
Expand Down
34 changes: 34 additions & 0 deletions apps/web/accuracy/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/svg+xml" href="../favicon.svg">
<title>Sol — astronomical comparison evidence</title>
<style>
body { max-width: 48rem; margin: 2rem auto; padding: 0 1rem; background: #0d1727; color: #e7edf5; font: 1rem/1.6 system-ui, sans-serif; }
a { color: #b9d9ff; overflow-wrap: anywhere; }
code { overflow-wrap: anywhere; }
a:focus-visible { outline: 2px solid #f3ca7b; outline-offset: 4px; }
li { margin: .6rem 0; }
</style>
<main>
<p><a href="../index.html">Return to Sol</a></p>
<h1>Astronomical comparison evidence</h1>
<p>Sol records independent comparisons of its native geometric position output with retained NASA/JPL Horizons DE441 vectors. These are measurements at 160 discrete samples: 16 epochs for each of ten explicit target/origin pairs. They do not certify the current displayed UTC date or every date between the samples.</p>
<p><a href="../data/independent-vector-evidence.json">Read the complete independent native comparison records (JSON)</a>. Every record retains the exact epoch, target, origin, reference and native vectors, residuals and acceptance result. The registry also contains source and provenance hashes. The original responses, query URLs, acquisition metadata and predeclared comparison plan are retained under <code>tests/fixtures/horizons-vectors-20261104</code> in the <a href="../licenses/solar-ephemeris/index.html">corresponding source distribution</a>.</p>
<p>The retained full-calendar matrix includes failed samples at remote epochs. Failed observations remain in the registry with <code>passed: false</code>; they cannot qualify a selection. Evidence integrity and passing a numerical accuracy budget are separate results.</p>
<h2>What was compared</h2>
<p>The quantity is geometric Cartesian position in AU, using the ecliptic of J2000, ICRF X axis and IAU76 obliquity. Light-time and apparent-position corrections are absent. Nine cases are heliocentric; the tenth is the Moon relative to Earth's centre. Several planetary reference targets are system barycentres, as their explicit Horizons target IDs show.</p>
<p>The reference epochs are in TDB. The native probe sets its TT model argument numerically equal to that reference epoch, with recorded numerical mismatch below 0.001 seconds. This retains the approximate TT/TDB equivalence (up to about 2 milliseconds); it does not independently validate ancient or future UTC/UT1 conversion.</p>
<h2>Three distinct residuals</h2>
<ul>
<li><strong>Relative vector residual, arcsecond-equivalent:</strong> the length of the vector difference divided by reference distance, multiplied by arcseconds per radian. The predeclared sample budget is at most 10.0. This metric includes distance error and is not angular separation.</li>
<li><strong>Angular separation, arcseconds:</strong> the angle between the native and reference direction vectors. No separate acceptance threshold is assigned.</li>
<li><strong>Radial residual, parts per million:</strong> signed relative distance error. No separate acceptance threshold is assigned.</li>
</ul>
<h2>Limits and reproducibility</h2>
<p>Only the native f64 System ABI was numerically compared. A release's WASM receipt binds corresponding scientific sources and binary hashes; it does not measure agreement between native and WASM results. These records do not qualify apparent sky directions, observer altitude, refraction, velocities, events, image rendering or a continuous epoch range.</p>
<p>The offline validator rejects changed scientific sources, reference artifacts, sample identities and stored residuals. From the corresponding source tree, run <code>python tools/validate_independent_vector_evidence.py --replay</code> to reproduce the native comparison with the locked offline Rust toolchain. Add <code>--require-all-pass</code> to enforce the unchanged 10.0 sample budget for the complete matrix; retained deep-time failures make that gate fail. Regeneration after scientific changes uses <code>python tools/generate_independent_vector_evidence.py</code>.</p>
<p><a href="../data/accuracy-evidence.json">The separate TOP2013 source-theory parity records</a> compare an implementation with its source theory. They remain distinct from independent astronomical comparison evidence.</p>
</main>
</html>
18 changes: 9 additions & 9 deletions apps/web/app.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
// Entry module: wires DOM events to the feature modules and kicks off loading.
// The app is split into ES modules under ./js/ — see docs/HANDOFF.md.

import { store } from "./js/store.js?v=dcca6290db";
import { renderAll, updateTaskHeader, currentViewPresentation } from "./js/view.js?v=dcca6290de";
import { store } from "./js/store.js";
import { renderAll, updateTaskHeader, currentViewPresentation } from "./js/view.js";
import { updateModeButtons } from "./js/surfaceNavigation.js";
import { showTip, hideTip, isTipHidden } from "./js/tooltip.js?v=dcca6290db";
import { registerOfflineRelease } from "./js/releaseClient.js?v=dcca6290db";
import { createViewEvidence } from "./js/viewEvidence.js?v=dcca6290db";
import { workspace, renderWorkspace, openInspector, revealWorkspaceControl } from "./js/workspace.js?v=dcca6290db";
import { explorer, initExplorer } from "./js/explorer.js?v=dcca6290db";
import { showTip, hideTip, isTipHidden } from "./js/tooltip.js";
import { registerOfflineRelease } from "./js/releaseClient.js";
import { createViewEvidence } from "./js/viewEvidence.js";
import { workspace, renderWorkspace, openInspector, revealWorkspaceControl } from "./js/workspace.js";
import { explorer, initExplorer } from "./js/explorer.js";
import {createViewLoader} from './js/viewLoader.js';
import {registerDestinationRenderer} from './js/viewRegistry.js';
import {initObservationMedia} from './js/observationMedia.js';
Expand All @@ -25,8 +25,8 @@ let activeView='observe',retryFocus=false;
const viewCode=createViewLoader({
loaders:{
research:()=>import('./js/research.js'),
sky:async()=>{const [view,overview]=await Promise.all([import('./js/sky.js?v=dcca6290db'),import('./js/destinationOverview.js?v=dcca6290de')]);return {...view,overview};},
orrery:async()=>{const [view,overview]=await Promise.all([import('./js/orrery.js?v=dcca6290e0'),import('./js/destinationOverview.js?v=dcca6290de')]);return {...view,overview};},
sky:async()=>{const [view,overview]=await Promise.all([import('./js/sky.js'),import('./js/destinationOverview.js')]);return {...view,overview};},
orrery:async()=>{const [view,overview]=await Promise.all([import('./js/orrery.js'),import('./js/destinationOverview.js')]);return {...view,overview};},
},
onState(state){
document.body.setAttribute('data-view-code',state.status);
Expand Down
Loading
Loading