Orbit lab window: themed lib/ui front-end over the physics core (rung 1, slice 1) - #21
Merged
Conversation
…mics#20 rung 1, slice 1) Fleet UI ladder rung 1, first slice. A run() front-end (orbit.eigs + orbit_main.eigs) over the UNMODIFIED physics.eigs damped-oscillator core: live phase portrait on a ui.canvas (world grid, axes, analytic equilibrium marked at the origin, teal trail, amber head), a zeta slider, pause/resume (button + Space), and the observer's live regime forecasts for energy and displacement. - orbit_theme.eigs: named palette mapped onto lib/ui theme keys via the DeslanStudio in-place field-by-field apply (BEFORE widget construction; never set_theme wholesale — it nulls sizing keys). The canvas plot surface reads its colours from the same module. - THE ORACLE (tests/test_orbit_oracle.sh): a headless run and a UI-stepped run (real window, real per-frame draw) of the same zeta/frames must dump byte-identical trajectories — the UI is a pure reader of the simulation. The checker is validated with a planted fault (different zeta must diff). Skips (exit 2) on a non-gfx runtime so it can never be silently dropped where gfx exists. - Devcontainer now builds the gfx variant + SDL2 + Xvfb (Tidepool pattern); CI runs the oracle alongside the smoke/lab suites. - FINDINGS: F-DYN-8 (import silently prefers stdlib lib/physics.eigs over the repo's physics.eigs), F-DYN-9 (lib/ui has no x-y parametric plot widget — chart is y-vs-index only), F-DYN-10 (viz widget surfaces hardcode colours instead of theme keys). - docs/orbit-lab.png: desktop-gui-qa screenshot of the live window. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The rebuilt gfx image no longer inherits python3; make the dependency explicit like the Tidepool image does. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CI's first oracle run skipped as "not gfx-capable" on a gfx image — xvfb-run needs xauth, which debian:stable-slim lacks, and the probe discarded stderr so an environment failure masqueraded as a missing capability. Install xauth, and make the probe distinguish the two: only "undefined variable 'gfx_open'" is a SKIP (exit 2); any other probe failure prints the output and FAILS. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First slice of dynamics#20 rung 1 (fleet UI ladder, hq/proposals/fleet-ui-expansion.md — approved 2026-08-02). The issue stays open: this is slice 1, not the whole rung (bifurcation sweeps, pan/zoom, and the chart-widget consumption land in later slices).
What this is
A
run()front-end over the unmodifiedphysics.eigsdamped-oscillator core (the repo's best-documented system; analytic equilibrium at the origin, marked red on the plot):orbit.eigs— the lab window: live phase portrait (x, v) on aui.canvas, world grid + axes, teal trail, amber current-state head; a zeta slider (0..2), pause/resume (button + Space), and the observer's live regime forecasts for energy and displacement (report of— the observer is the instrument).orbit_theme.eigs— named palette mapped onto lib/ui theme keys with the DeslanStudio in-place field-by-field apply, called before widget construction (neverset_themewholesale — it nulls the sizing keys). The canvas plot surface reads its colours from the same module, so chrome and plot are themed together.orbit_main.eigs— standalone launcher (eigenscript orbit_main.eigs, gfx build).The oracle (non-negotiable, and green)
tests/test_orbit_oracle.sh: a headless run and a UI-stepped run (real window, real per-frame draw through the same tick path an interactive session uses) of the same system/zeta/frames must dump byte-identical trajectories — the UI is a pure reader of the simulation. Both paths advance through the oneframe_advance(SUB unobserved substeps of the core'sstep, the specimen's own cadence) and format through the onetraj_line.The checker is validated with a planted fault (a zeta=0.16 headless run must NOT compare equal). The script exits 2 on a non-gfx runtime — a skip is a failure in CI, so the UI oracle can never be silently dropped from a gfx-capable environment. Verified locally on both the gfx and release builds (trajectories byte-identical across builds too).
CI
The devcontainer now builds the gfx variant and ships SDL2 + Xvfb (the Tidepool pattern; SDL2 is dlopen'd so no -dev headers).
test.ymlruns the oracle alongside the existing smoke/lab suites — all three green locally against the v0.34.0 pin.Gap ledger (FINDINGS.md, for upstream filing)
import physicssilently resolves to the stdlib'slib/physics.eigs(formula library), shadowing the repo'sphysics.eigs; members readnulland the first symptom is a downstream type error. Worked withload_file(path-explicit); candidate upstream: shadowing warning or cwd-first resolution.chartis strictly y-vs-index. The phase portrait is canvas-drawn in this slice; third consumer (with eigen-sheet#26, EigenMiniSat#76) now forcing the chart/plot widget._render_chart/_render_bar_chart/_render_waveform_view) hardcode their background/grid colours instead of reading theme keys — a themed app cannot restyle exactly the surfaces a data app is made of.Screenshot evidence from a driven session on the real desktop (slider drag and pause toggle verified by pixels) is in
docs/orbit-lab.png.🤖 Generated with Claude Code