Skip to content

feat(rate-of-closure): add responsive wind strategy workflow - #4282

Draft
d-sorgcodexagent[bot] wants to merge 25 commits into
feat/4199-wind-scalar-adapterfrom
feat/4199-wind-workflow
Draft

feat(rate-of-closure): add responsive wind strategy workflow#4282
d-sorgcodexagent[bot] wants to merge 25 commits into
feat/4199-wind-scalar-adapterfrom
feat/4199-wind-workflow

Conversation

@d-sorgcodexagent

Copy link
Copy Markdown
Contributor

Summary

Completes the current-launch wind-strategy workflow slice of #4199 on top of the scalar-ensemble adapter in #4281.

  • Adds matched PyQt6 and React wind-strategy workspaces driven by the current launch and canonical spatial target.
  • Runs immutable paired ensembles off the GUI/main thread with exact progress, cooperative cancellation, teardown, and stale-result invalidation.
  • Exposes every declared scalar as an axis, cohort/status availability, risk summaries, captured calculation basis, and null-preserving formula-neutralized all-row CSV export.
  • Adds native/custom zoom, Auto Fit, reset history, and movable/hidden legend controls.
  • Adds accessible ball-flight looping with one owned timer/animation frame.
  • Compacts the PyQt setup into a two-column Setup view and automatically selects the plot-first Results view on completion.
  • Updates both repository handoffs with the ground/parity audit contracts and capability-observer continuation.

Root cause and design

The shared wind analysis and scalar adapter existed, but neither user surface had a responsive, lifecycle-safe execution workflow. Long runs would otherwise tempt GUI-thread execution, and results could silently become stale after launch, target, model, or uncertainty edits. This change builds each run from an immutable captured request, streams bounded progress, publishes only a complete non-stale result, and keeps unavailable values explicit.

Validation

  • Python/PyQt/shared swing: 1,350 passed, 5 skipped, 15 warnings.
  • React: 94 files / 566 tests passed.
  • Rust swing core: 12 passed.
  • Ruff, Black, targeted mypy, TypeScript, zero-warning ESLint, and git diff checks passed.
  • Production Vite build: 175 modules; wind worker and Wind Strategy workspace remain separate chunks; main chunk 472.58 kB with no size warning.
  • All 19 changed production modules are at most 400 physical lines.
  • Live PyQt QA at 1280x768: separate flight plots, continuous Loop playback through landing, five-trial wind run completed 5/5, calculation basis/summary/scatter/Auto Fit/native pan-zoom/legend controls visible without overlap.

The five Python skips are the optional local swing_core/tools_core wheel fast paths. The warnings are the existing Hypothesis norecursedirs warning and empty polynomial-preview legend warning. The in-app browser refused localhost navigation under its URL policy, so React UI evidence is the complete component suite and production build rather than a claimed live-browser pass.

Stack

Base: feat/4199-wind-scalar-adapter / #4281
Head: feat/4199-wind-workflow / fdcc25008

This PR is intentionally draft and stacked. Do not retarget, force-push, or merge ahead of its parent.

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

⚠️ SPEC.md Update Required

Source files were modified in this PR but SPEC.md was not updated.

Per the Specification-Driven Development Policy:

  • Any PR that adds, removes, or changes functionality must update SPEC.md
  • Update the relevant sections (features, architecture, tests, dependencies, etc.)
  • Bump the Spec Version if making substantive changes

To resolve:

  1. Update SPEC.md to reflect your changes, OR
  2. Add the spec-exempt label if this PR genuinely doesn't affect the spec (e.g., pure refactor with no behavior change)

This check is enforced by the spec-check CI workflow.

dieterolson and others added 18 commits August 7, 2026 20:08
…n workspaces

Expose the qualified Waterloo/Penner capability optimizer as a primary
Shot Optimizer module in both clients: strict cross-runtime
capability-optimization-workflow/v1 authoring and persistence,
off-UI-thread execution with truthful progress and cooperative
cancellation, complete scalar-ensemble/v1 cohort retention, ranked
alternatives, stage-qualified scatter axes, bounded raw-row paging,
spreadsheet-safe CSV, and stable JSON. The React panel is lazy-loaded
so the main Vite chunk stays under the 500 kB warning threshold, and
saved v1 layouts reveal newly registered modules. Handoff documents are
updated in this implementation commit per fleet policy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t reveal

Add PyQt workflow/worker/GUI suites and React workflow, worker-client,
run, panel, and results tests for the Shot Optimizer slice; extend
primary-navigation coverage so saved layouts reveal newly registered
modules and the new tab registers exactly once in both clients.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… gates

Add the SPEC 1.14.6 change-log row, document the end-user workflow in
the capability optimization spec, and update the campaign handoff with
the recovered slice and its verified gate evidence.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
No material source change; handoff pointer update only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…cess

The dict-splat construction of CapabilityWorkflowInputs failed the
hosted delta-mypy gate because **dict[str, float] cannot be proven
against the integer fields. Build the snapshot with explicit typed
keyword arguments instead; behavior is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Handoff update for implementation commit 101020b per fleet policy;
no source change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The prior note wrongly framed the 3.10 StrEnum ImportError as a
stack-wide defect to fix in source. requires-python is >=3.11 and only
quality-gate and tests (3.11) are required checks, so the 3.10 lane is
a stale-matrix artifact. No source change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The observation contract has only complete/no_impact/failed members, so a
horizon nonconvergence is normalized into failed. Reporting a bare
"failed N" reads as numerical breakage when the retained reason says the
flight simply did not reach the ground inside the configured horizon.
Both clients now append the retained reason codes with counts, which is
data the adapter already carries per row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A descending launch starts at z=0 and is already below ground once the
t > dt guard permits the crossing check, so the interpolation ratio went
negative and extrapolated the crossing to a negative sample time. That
raised RangeError: timeS must be nonnegative, which the observation
layer absorbed as an untyped evaluator_exception on 12 of 96 samples of
a default driver search while Python reported none. Clamping the ratio
to [0, 1] keeps the crossing inside the detecting step, so these samples
report nonconverged and match the Python runtime.

Also builds _lerp_vector's 3-tuple explicitly instead of carrying an
unused type: ignore, and coerces _curve to float, clearing the hosted
delta-mypy gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Brings in the evaluator branch descending-launch and delta-mypy repairs.
Resolves the two documentation conflicts by keeping both slices: SPEC.md
retains the 1.14.6 workspace row above the amended 1.14.5 evaluator row
at header version 1.14.6, and the tool handoff keeps the workspace
completion record ahead of the evaluator repair entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(rate-of-closure): matched PyQt6/React capability optimization workspaces
feat(rate-of-closure): bind optimizer to full flight
feat(rate-of-closure): stream capability optimizer samples
The per-slice stacked-branch cautions described the stack while it was
open and now read as active constraints, so state plainly that #4283,
#4289, and #4294 are merged onto this branch, how they were folded, what
was verified here (1426 Python, 624 React), and that the incomplete CI
matrix reflects 25 of 28 org runners being offline rather than failures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant