Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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: 10 additions & 0 deletions .github/workflows/rate-web-playwright-trusted.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ on:
- "src/rate_of_closure/club/**"
- "src/rate_of_closure/club_camera.py"
- "src/rate_of_closure/club_mesh_source.py"
- "src/rate_of_closure/flight_accepted_study.py"
- "src/rate_of_closure/flight_sample_inspector.py"
- "src/rate_of_closure/mesh.py"
- "src/rate_of_closure/model.py"
- "src/rate_of_closure/plotting/**"
Expand All @@ -24,11 +26,18 @@ on:
- "src/shared/python/swing_sim/putting.py"
- "tests/rate_of_closure/pyqt_putting_sample_inspector_probe.py"
- "tests/rate_of_closure/pyqt_club_camera_probe.py"
- "tests/rate_of_closure/pyqt_flight_sample_inspector_probe.py"
- "tests/rate_of_closure/test_club_camera.py"
- "tests/rate_of_closure/test_club_mesh_source.py"
- "tests/rate_of_closure/test_club_view_camera.py"
- "tests/rate_of_closure/test_flight_accepted_study.py"
- "tests/rate_of_closure/test_flight_explorer.py"
- "tests/rate_of_closure/test_flight_explorer_atomic_gui.py"
- "tests/rate_of_closure/test_flight_sample_inspector.py"
- "tests/rate_of_closure/test_flight_sample_inspector_gui.py"
- "tests/rate_of_closure/test_mesh.py"
- "tests/rate_of_closure/test_pyqt_club_camera_rendered.py"
- "tests/rate_of_closure/test_pyqt_flight_sample_inspector_rendered.py"
- "tests/rate_of_closure/test_pyqt_putting_sample_inspector_rendered.py"
- "tests/rate_of_closure/pyqt_variation_render_probe.py"
- "tests/rate_of_closure/test_pyqt_variation_rendered_interactions.py"
Expand Down Expand Up @@ -91,6 +100,7 @@ jobs:
tests/rate_of_closure/test_pyqt_variation_visual_state_rendered.py
tests/rate_of_closure/test_pyqt_putting_sample_inspector_rendered.py
tests/rate_of_closure/test_pyqt_club_camera_rendered.py
tests/rate_of_closure/test_pyqt_flight_sample_inspector_rendered.py
tests/rate_of_closure/test_pyqt_visualization_tab_visibility.py -q -n 0

- name: Retain Playwright evidence
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/rate-web-playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ on:
- "src/rate_of_closure/club/**"
- "src/rate_of_closure/club_camera.py"
- "src/rate_of_closure/club_mesh_source.py"
- "src/rate_of_closure/flight_accepted_study.py"
- "src/rate_of_closure/flight_sample_inspector.py"
- "src/rate_of_closure/mesh.py"
- "src/rate_of_closure/model.py"
- "src/rate_of_closure/plotting/**"
Expand All @@ -23,11 +25,18 @@ on:
- "src/shared/python/swing_sim/putting.py"
- "tests/rate_of_closure/pyqt_putting_sample_inspector_probe.py"
- "tests/rate_of_closure/pyqt_club_camera_probe.py"
- "tests/rate_of_closure/pyqt_flight_sample_inspector_probe.py"
- "tests/rate_of_closure/test_club_camera.py"
- "tests/rate_of_closure/test_club_mesh_source.py"
- "tests/rate_of_closure/test_club_view_camera.py"
- "tests/rate_of_closure/test_flight_accepted_study.py"
- "tests/rate_of_closure/test_flight_explorer.py"
- "tests/rate_of_closure/test_flight_explorer_atomic_gui.py"
- "tests/rate_of_closure/test_flight_sample_inspector.py"
- "tests/rate_of_closure/test_flight_sample_inspector_gui.py"
- "tests/rate_of_closure/test_mesh.py"
- "tests/rate_of_closure/test_pyqt_club_camera_rendered.py"
- "tests/rate_of_closure/test_pyqt_flight_sample_inspector_rendered.py"
- "tests/rate_of_closure/test_pyqt_putting_sample_inspector_rendered.py"
- "tests/rate_of_closure/pyqt_variation_render_probe.py"
- "tests/rate_of_closure/test_pyqt_variation_rendered_interactions.py"
Expand Down Expand Up @@ -96,6 +105,7 @@ jobs:
tests/rate_of_closure/test_pyqt_variation_visual_state_rendered.py
tests/rate_of_closure/test_pyqt_putting_sample_inspector_rendered.py
tests/rate_of_closure/test_pyqt_club_camera_rendered.py
tests/rate_of_closure/test_pyqt_flight_sample_inspector_rendered.py
tests/rate_of_closure/test_pyqt_visualization_tab_visibility.py -q -n 0

- name: Retain Playwright evidence
Expand Down
26 changes: 26 additions & 0 deletions AGENT_HANDOFF.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,32 @@
> **Update this file with every PR and every push to main.**
> Last updated: 2026-08-13

## 2026-08-13 Flight hosted typing closure (#4433)

Version 1.16.94 narrows the immutable NumPy return, keeps Qt signals and
`eventFilter` on the concrete `FlightView`, and gives the execution mixin
type-check-only optional result contracts. This closes the hosted Python 3.12 /
MyPy 1.13 findings without runtime stubs or an MRO change. Flight authority,
interaction, rendering, diagnostic evidence, and the open #4433 limitations
are unchanged.

## 2026-08-13 Flight synchronized sample inspector (#4433)

Version 1.16.93 adds immutable, generation-bound accepted-flight bundles and
matched React/PyQt raw-sample inspectors. The accepted exploration retains
aligned time/position/velocity, while a maximum 1,002-sample plan binds exact
current-primary time/position; the calm ghost
is comparison-only. Twelve-CSS-pixel pointer picking and Arrow/Home/End/Escape
navigation drive the sole 3D playback time without rerunning flight physics.
React direct-entry and PyQt direct/delivery model, kernel, wind, launch,
summary, origin, and landing evidence is validated before atomic publication;
the separate target overlay is refreshed in the same PyQt transaction. Failed computation
or UI/render publication retains prior scientific authority; if pixels cannot
be restored the visible warning says the image may be stale. Three Chromium React
selected viewport captures and eight PyQt selected/error window/canvas DPI PNGs are
diagnostic-only, not approved goldens. Runtime-local sample indices are not a
portable cross-solver identity, and #4433 remains open.

## 2026-08-13 Club Explorer hosted dtype closure (#4433)

Version 1.16.92 explicitly types the structured binary-STL NumPy dtype and
Expand Down
34 changes: 32 additions & 2 deletions SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,42 @@
| **Owner** | D-sorganization |
| **Primary Language(s)** | Python 3.11+, Rust, JavaScript, TypeScript |
| **License** | MIT |
| **Current Version** | 1.16.92 |
| **Spec Version** | 1.16.92 |
| **Current Version** | 1.16.94 |
| **Spec Version** | 1.16.94 |
| **Last Spec Update** | 2026-08-13 |

## 2. Purpose & Mission

### 2026-08-13 Flight hosted typing closure (#4433)

Version 1.16.94 makes the accepted-flight NumPy snapshot return explicit,
keeps Qt signals and event filtering on the concrete view, and supplies
`TYPE_CHECKING`-only optional result fields to the execution mixin. Pinned
Python 3.12 / MyPy 1.13 accepts all 13 changed Flight source files. Runtime
science, atomic publication, interaction, artifacts, and open #4433 boundaries
are unchanged.

### 2026-08-13 Flight synchronized sample inspector (#4433)

Version 1.16.93 adds matched React/PyQt inspection of exact runtime-local flight
samples. React direct entry and PyQt direct/delivery each produce an immutable
generation-bound bundle containing the complete producing context,
launch/model/kernel/wind provenance, aligned time/position/velocity evidence,
optional calm comparison, validated summaries, and a time/position plan capped
at 1,002 samples before planner copying/allocation. The separate target overlay is
transactionally refreshed from the accepted trajectory. Canonical tee origin,
launch velocity, ground floor, landing,
and wind-delta cohesion fail closed. The current primary cohort alone is
selectable; the calm trace is a comparison ghost with no inferred raw-index
correspondence. Twelve-pixel pointer selection and Arrow/Home/End/Escape update
side/top markers, status, and the sole 3D playback timestamp without scientific
recomputation. React and PyQt retain prior or honest empty authority on failure;
PyQt publication spans target, renderer, controls, rows, deltas, statuses, and
public references, while a failed pixel rollback is explicitly labeled stale.
Three Chromium React selected viewport and eight PyQt selected/error window/canvas DPI PNGs are
diagnostic-only, not approved goldens. Raw indices are runtime-local rather than
portable solver identity, and broader #4433 tab/approval work remains open.

### 2026-08-13 Club Explorer hosted typing closure (#4433)

Version 1.16.91 closes the pinned Python 3.12 / MyPy 1.13 Club Explorer
Expand Down
36 changes: 36 additions & 0 deletions docs/development/RATE_OF_CLOSURE_CAMPAIGN_HANDOFF.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,41 @@
# Rate of Closure Campaign Handoff

## 2026-08-13 #4433 Flight hosted typing closure

- The accepted-flight NumPy snapshot has an explicit array return, Qt signals
and `eventFilter` remain on the concrete viewer, and optional accepted-result
fields exist only under `TYPE_CHECKING` in the execution mixin.
- Pinned Python 3.12 / MyPy 1.13 accepts all 13 changed Flight sources; focused
Python/Qt behavior remains 36/36. This is static-only: science, interaction,
rendering, diagnostic evidence, and open boundaries are unchanged. SPEC is
1.16.94; #4433 remains open.

## 2026-08-13 #4433 Flight synchronized sample inspector

- A Python-owned golden and strict Python/TypeScript twins cap raw evidence at
1,002 samples before planner copying/allocation, preserve launch/apex/landing semantics,
and reject malformed, nonfinite, overflow-prone, translated, airborne-final,
below-ground, or provenance-incoherent trajectories.
- React direct entry and PyQt direct/delivery each publish one immutable accepted
bundle with exact producing inputs, launch, model/kernel/wind provenance,
aligned time/position/velocity, optional calm comparison, derived summaries, and the
generation-bound time/position display plan. The separate target overlay is
transactionally refreshed from the accepted trajectory.
The calm ghost has no inferred correspondence and is never selectable.
- Side/top pointer selection is bounded to 12 rendered pixels; keyboard
navigation and misses preserve focus and exact raw identity. Selection jumps
the sole 3D playback owner to the exact accepted timestamp without a solver
rerun. Canonical speed survives all presentation-unit switches.
- PyQt commits target, view, controls, result rows, deltas, statuses, and public
references as one transaction. Failed repaint retains scientific authority;
failed pixel restoration is labeled stale/unavailable and idle redraw pauses
until a proven recovery. React retains prior or honest empty evidence with a
bounded alert and marks edited inputs as different from displayed context.
- Three Chromium React selected viewport captures plus eight PyQt selected/error-prior
window/canvas DPI PNGs are diagnostic only. The retained raw grid differs by runtime,
so indices are runtime-local evidence, not cross-solver identity. SPEC is
1.16.93; #4433 remains open for remaining tabs and approval/AT coverage.

## 2026-08-13 #4433 Club Explorer hosted dtype closure

- The structured binary-STL dtype is explicitly typed and three binding boolean
Expand Down
2 changes: 2 additions & 0 deletions scripts/test_assertion_allowlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,7 @@ tests/rate_of_closure/pyqt_variation_render_probe.py
tests/rate_of_closure/pyqt_variation_visual_state_probe.py
# Subprocess entrypoint; semantic assertions live in the owning rendered test.
tests/rate_of_closure/pyqt_putting_sample_inspector_probe.py
# Subprocess entrypoint; semantic assertions live in the owning rendered test.
tests/rate_of_closure/pyqt_flight_sample_inspector_probe.py
# Subprocess entrypoint; semantic assertions live in the owning tab-visibility test.
tests/rate_of_closure/pyqt_visualization_tab_probe.py
26 changes: 26 additions & 0 deletions src/rate_of_closure/AGENT_HANDOFF.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,32 @@
> **Update this file with every PR and every push to main.**
> Last updated: 2026-08-13

## 2026-08-13 Flight hosted typing closure (#4433)

- The immutable NumPy return is explicitly narrowed, Qt signal/event ownership
stays on the concrete `FlightView`, and the execution mixin's optional result
fields are declared under `TYPE_CHECKING` only.
- Pinned Python 3.12 / MyPy 1.13 accepts all 13 changed Flight sources. This is
static-only: runtime MRO, scientific authority, interaction, rendering,
artifacts, and open #4433 limits are unchanged. SPEC is 1.16.94.

## 2026-08-13 Flight synchronized sample inspector (#4433)

- React direct entry and PyQt direct/delivery snapshot one complete accepted
flight: producing inputs, launch/model/kernel/wind provenance, aligned raw
time/position/velocity, optional calm comparison, summaries, and a bounded
time/position plan. The separate target overlay is transactionally aligned.
- Only the current primary cohort is selectable. Exact raw-index selection is
generation-bound, uses a 12 CSS/display-pixel radius, retains on misses, and
synchronizes side/top markers, polite status, and the sole 3D playback time.
- All target/view/row/delta/status/public-reference publication is transactional.
First failure stays empty; prior failure retains authority and selection. A
failed pixel rollback is reported as stale/unavailable rather than fabricated
retained imagery. Presentation-unit changes preserve canonical speed exactly.
- Chromium React selected evidence covers 1440x900, 1280x720, and 390x844. Eight PyQt
selected/error-prior window/canvas PNGs cover DPI 1.0/1.5 with exact canvas identity. These
PNGs are diagnostic, not approved goldens. SPEC is 1.16.93; #4433 remains open.

## 2026-08-13 Club Explorer hosted dtype closure (#4433)

- The binary-STL record now has an explicit structured NumPy dtype, and Qt/
Expand Down
Loading
Loading